本人使用過(guò)python的gevent協(xié)程方案寫過(guò)游戲服務(wù)器,看了workerman后有幾點(diǎn)疑問(wèn)如下
1.gevent遇見(jiàn)io訪問(wèn)的時(shí)候,會(huì)自動(dòng)切換到別的協(xié)程上,實(shí)現(xiàn)了同步代碼異步效果,那么在workerman在碰到io訪問(wèn)時(shí)代碼的執(zhí)行流程是啥樣的?
2.gevent可以實(shí)現(xiàn)手動(dòng)代碼切換協(xié)程變更執(zhí)行流程,workerman中怎么實(shí)現(xiàn)切換代碼執(zhí)行流程?
3.gevent是單進(jìn)程多協(xié)程方案,用戶連接上來(lái)在一個(gè)進(jìn)程內(nèi),可以很方便的處理客戶連接,workerman是多進(jìn)程方案,用戶連接可能被分布在不同的進(jìn)程內(nèi),進(jìn)程a的用戶需要和進(jìn)程b的用戶通信,這樣的情況怎么實(shí)現(xiàn)?
4.gevent的協(xié)程方案,當(dāng)某個(gè)協(xié)程被block住了,那么會(huì)被切換到別的協(xié)程,那么在workerman中,如果worker執(zhí)行中需要查詢mysql,redis,別的三方http服務(wù),是不是如果這個(gè)worker沒(méi)有執(zhí)行完成,就無(wú)法去處理下一個(gè)任務(wù)?
感謝!
php 自身沒(méi)有提供異步io,比如使用php自帶的mysql redis擴(kuò)展等操作在php都是阻塞的,workerman里使用這些阻塞也是阻塞的。
不過(guò)workerman本身的io都是非阻塞的,比如給客戶端發(fā)送消息和接受消息。另外workerman提供了一些異步庫(kù),比如redis、異步http-client。
如果workerman進(jìn)程block住了,那么這個(gè)進(jìn)程就block住了,這時(shí)候需要多開一些進(jìn)程,而且業(yè)務(wù)要保證不要長(zhǎng)時(shí)間block。
這里有一個(gè)大佬用php的yield特效魔改workerman
https://github.com/PaulXu-cn/CoWorkerman