本人使用过python的gevent协程方案写过游戏服务器,看了workerman后有几点疑问如下
1.gevent遇见io访问的时候,会自动切换到别的协程上,实现了同步代码异步效果,那么在workerman在碰到io访问时代码的执行流程是啥样的?
2.gevent可以实现手动代码切换协程变更执行流程,workerman中怎么实现切换代码执行流程?
3.gevent是单进程多协程方案,用户连接上来在一个进程内,可以很方便的处理客户连接,workerman是多进程方案,用户连接可能被分布在不同的进程内,进程a的用户需要和进程b的用户通信,这样的情况怎么实现?
4.gevent的协程方案,当某个协程被block住了,那么会被切换到别的协程,那么在workerman中,如果worker执行中需要查询mysql,redis,别的三方http服务,是不是如果这个worker没有执行完成,就无法去处理下一个任务?
感谢!
php 自身没有提供异步io,比如使用php自带的mysql redis扩展等操作在php都是阻塞的,workerman里使用这些阻塞也是阻塞的。
不过workerman本身的io都是非阻塞的,比如给客户端发送消息和接受消息。另外workerman提供了一些异步库,比如redis、异步http-client。
如果workerman进程block住了,那么这个进程就block住了,这时候需要多开一些进程,而且业务要保证不要长时间block。
这里有一个大佬用php的yield特效魔改workerman
https://github.com/PaulXu-cn/CoWorkerman