前言
每一个并发的API背后的代码都需要允许并发运行的,以下是使用不同API的例子:
gomyfunc();//Golangpthread_create(thread_id,NULL,myfunc);/*CwithPOSIXthreads*/spawn(modulename,myfuncname,[])%Erlangthreading.Thread(target=myfunc).start()#Pythonwiththreadsasyncio.create_task(myfunc())#Pythonwithasyncio在不同的符号和术语中有许多变体,但语义是一样的。上面的例子是以并发的方式运行myfunc以便使用程序空闲的资源,并且调用后立马回到父进程(或主线程)去做其他事情。
另一种方式是使用回调:
QObject::connect(emitter,SIGNAL(event()),//C++withQtreceiver,SLOT(myfunc()))g_signal_connect(emitter,event,myfunc,NULL)/*CwithGObject*/document.getElementById(myid).onclick=myfunc;//Javascriptpromise.then(myfunc,errorhandler)//JavascriptwithPromisesdeferred.addCallback(myfunc)#PythonwithTwistedfuture.add_done_callback(myfunc)#Pythonwithasyncio再说,虽然语法不一样,但是它们都完成同样的事情:它们安排好任务(arrange),之后,直到某一事件发生了,myfunc就会运行。注册“事件回调”成功,以上的函数就立即返回,调用者可以继续做其他事情。(有时候回调可以被巧妙地封装成helper,例如promise