my client wanted their apps synced, and i made it with go
TRANSCRIPT
Myclientwantedtheirappssynced,andImadeitwithGo
@torufurukawaToruFurukawa
Canyourunappsinparallel?
Yes,Iguess
Iwillsendpurchaseorder.
Solversimulatesonly1Object
Solver(app/DLL)
Wrapperapp
SimulaMngmulMpleobjectsserially
Solver
ControlWrapper Wrapper
Swapsinternalvariables
Wanttoruntheminparallelandsynced
ControlWrapper Wrapper
Wrapper
Wrapper
(concurrent)
Concurrency?Sync?Go!
hOps://talks.golang.org/2012/waza.slide#14
• Concurrency• Messaging(dataexchange)• SynchronizaMon
Process
Libmemory
DLLsimulatesanobject'sbehavior
DLL
Load
DelegatesimulaMontoDLLfuncdll,err:=syscall.LoadDLL(path)
proc:=dll.MustFindProc("simulate")
...
for{
ret,_,err:=proc.Call(...)
ret!=0{
break
}
}
MakeanotherDLLtocallsolverDLL
wrap_f(double*x){
*x=f();
}
Goapp
WrapperDLLwrap_f()
SolverDLLf()
Process
Libmemory
ConcurrencyProcess
Libmemory
DLLfile
Load
Process
Libmemory
Addmessagebroker
Process Process Process
MessageBroker
Listen,AcceptandHandle
funcmain(){
...
ch:=make(chanevent)
golistenAndServe(ch,...)
...
}
Listen,AcceptandHandlefunclistenAndServe(chanevent){
ln,err:=net.Listen(…)
for{
conn,err:=ln.Accept()
gohandleConn(conn,ch)
}
}
HandleRequestsfunchandleConn(...){
for{
req:=read(conn)
respCh:=make(chan…)
ch<-event{req,
respCh}
resp:=<-respCh
write(conn,resp)
}
}
funcmain(){
…
for{
e:=<-ch
result=do(e.req)
e.respCh<-result
}
}
Messaging
Process Process Process
MessageBroker
SET SET SET GET
Needallprocessessynced
ProcessA
Time
ProcessB
ProcessC
Suspendtaskifnotreadyfuncmain(){
...
for{
event:=<-ch
if!ready(event.req){
tasks=append(tasks,
func(){do(event.req)})
continue
}
result=do(event.req)
...
}
Flushtaskswhenready
funcmain(){
...
ifreadyToFlush(...){
for_,t:=rangetasks{
t()
}
tasks:=make([]task,0)
}
...
}
Sync
ProcessA
Time
ProcessB
ProcessC
Concurrency?Sync?Go!
Justshippedlastweek
@torufurukawa