$POO FSSPS w GVOD%JBM5JNFPVU OFUXPSL BEESFTTTUSJOH UJNFPVUUJNF%VSBUJPO $POO FSSPS w GVOD'JMF$POO G PT'JMF D$POO FSSFSSPS w GVOD1JQF $POO $POO w UZQF%JBMFS w GVOD E %JBMFS %JBM OFUXPSL BEESFTTTUSJOH $POO FSSPS w UZQF-JTUFOFS w GVOD'JMF-JTUFOFS G PT'JMF M-JTUFOFS FSSFSSPS w GVOD-JTUFO OFU MBEESTUSJOH -JTUFOFS FSSPS
w UZQF"EESFTT w GVOD1BSTF"EESFTT BEESFTTTUSJOH "EESFTT FSSPS w GVOD B "EESFTT 4USJOH TUSJOH w UZQF)FBEFS w GVOD I)FBEFS "EESFTT-JTU LFZTUSJOH <> "EESFTT FSSPS w GVOD I)FBEFS %BUF UJNF5JNF FSSPS w GVOD I)FBEFS (FU LFZTUSJOH TUSJOH w UZQF.FTTBHF w GVOD3FBE.FTTBHF SJP3FBEFS NTH .FTTBHF FSSFSSPS w جຊతͳྲྀΕNBJM3FBE.FTTBHFͰϝοηʔδΛಡΈࠐΜͰɺ.FTTBHF#PEZͰຊจʹɺ.FTTBHF)FBEFSͰϔομ ʹΞΫηε͢Δɻ
ෳͷΫϥΠΞϯτ͕ίωΫγϣϯΛڞ༗͢ΔͨΊͷΈ w 3FBEFS ελʔλείʔυɺϔομɺޙଓߦ͕ۭനͰΠϯσϯτ͞ΕͯυοτͰऴΘΔຊจΛѻ͑Δ w 8SJUFS ্هͷϑΥʔϚοτʹैͬͯϝοηʔδΛॻ͚Δ 1JQFMJOFͷ͍ํɿ id := p.Next() // take a number ! p.StartRequest(id) // wait for turn to send request «send request» p.EndRequest(id) // notify Pipeline that request is sent ! p.StartResponse(id) // wait for turn to read response «read response» p.EndResponse(id) // notify Pipeline that response is read
ෳͷಉҰܕͷΦϒδΣΫτΛొ͢Δ͜ͱͰ͖ͳ͍ w ొͨ͠ΦϒδΣΫτͷϝιουͷ͏ͪɺҎԼͷ݅Λຬͨͨ͠ϝιου͕ެ։͞ΕΔ w ϝιου͕ެ։͞Ε͍ͯΔ େจࣈͰ࢝·͍ͬͯΔ w ͭͷҾΛ࣋ͪɺͲͪΒͷܕެ։͞Ε͍ͯΔ͔ϏϧτΠϯܕͰ͋Δ w ൪ͷҾϙΠϯλܕͰ͋Δ w Γ͕FSSPSܕͰ͋Δ w ཁ͢ΔʹɺҎԼͷܗࣜͰ͋Εྑ͍ɻ ! w ҙɿ5 5 5FODPEJOHHPCͰγϦΞϥΠζσγϦΞϥΠζͰ͖ͳ͚ΕͳΒͳ͍ কདྷ؇͞ΕΔ͔ w +40/ͳΒOFUXPSLSQDKTPOSQDύοέʔδ͕͋Δ w ࠷ॳͷҾ͕ϦΫΤετͷύϥϝʔλͰɺ൪ͷҾ͕Ϩεϙϯεʹ૬͢Δ func (t *T) MethodName(argType T1, replyType *T2) error
w ΫϥΠΞϯτଆ w ίωΫγϣϯΛཱ֬ͨ͋͠ͱʹ/FX$MJFOUΛݺͿɻ%JBMϝιουΛ͏ͱ྆ํ͕ग़དྷ ͯศརɻ w $MJFOUΦϒδΣΫτͷ$BMMϝιουΛݺͿͱಉظతʹɺ(PϝιουΛݺͿͱඇಉظత ʹϨεϙϯεΛॲཧ͢Δ w ໌ࣔతʹίʔσοΫ͕ࢦఆ͞Ε͍ͯͳ͍ͳΒɺFODPEJOHHPC͕ΘΕΔ
with net/rpc not the other way around.” “the only thing they did wrong was call it "jsonrpc". :-)” - Andre Moraes (https://groups.google.com/forum/#!topic/golang-nuts/SGXmAvzD7DM) w (PSJMMB+40/31$ʹ४ڌ͍ͯ͠ΔΒ͍͠ IUUQXXXHPSJMMBUPPMLJUPSHQLHSQDKTPO arith := new(data.Arith) ! rpc.Register(arith) rpc.HandleHTTP() ! l, err := net.Listen("tcp", ":1234") for { conn, err := l.Accept() if err != nil { log.Fatal(err) } go jsonrpc.ServeConn(conn) } αʔόʔଆɿ ΫϥΠΞϯτଆɿ conn, err := net.Dial("tcp", ":1234") defer conn.Close() client := jsonrpc.NewClient(conn) ! // Synchronous call args := &data.Args{7, 8} var reply int err = client.Call("Arith.Multiply", args, &reply) fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)