关于异步IO模型的疑问

只会PHP

最近在看unix网络编程,发现有多种IO模型,workerman使用的是多路复用IO模型,该模型阻塞在select,poll调用上,但是可以接收多个套接字,实际的IO操作是阻塞的,stream_set_blocking设置非阻塞好像没有什么作用,因为多路复用模型是在套接字可读写的时候才进行读写操作。不知以上理解是否正确?

1215 2 2
2个回答

admin

l宏观异步,实际阻塞

  • 暂无评论
静默

“实际的IO操作是阻塞的,stream_set_blocking设置非阻塞好像没有什么作用”

我感觉这个说得不对,实际操作是非阻塞的,stream_set_blocking设置非阻塞也有用,比如fread阻塞调用没数据或者数据不够会一直阻塞在fread,那其他socket就没机会调用fread了。非阻塞掉用没数据或者数据不够会立刻返回,这样不影响其它socket读数据

  • blogdaren 2022-04-19

    一般咱们看见的入门示例都是简单的bind listen accept read四步曲,其中没有使用IO多路复用,stream_set_blocking设置为非阻塞以后,工作起来确实如你所言,fread非阻塞效果显而易见,但问题关键就在于使用了IO多路复用,比如读事件:当检测到socket可读条件就绪的时候,就意味着数据已经准备好了可以读了,所以此时触发fread肯定是不会阻塞的,既然如此,这种上下文环境下的stream_set_blocking()无论是设置阻塞或非阻塞标记位与否似乎都没什么意义,所以猜题主的疑惑点应该是在这里,我也有这样的疑惑。

  • 只会PHP 2022-04-19

    所以感觉多路复用+ stream_set_blocking只是让accept非阻塞,实际read还是阻塞的。

  • blogdaren 2022-04-19

    不啊,调用read后是否导致进程阻塞还是取决于stream_set_blocking的设置的,这点是确定的。

年代过于久远,无法发表回答
🔝