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