webman同一个进程到底是不是可以并发处理请求呢

renji566

问题描述

作者的回答是排队执行,第一个的请求没有响应完不会去处理第二个请求的请求,假如第一个请求里没有同步io也是排队执行吗?

https://www.workerman.net/q/12186
这个问题的下面的回答说可以在第一个请求没有响应前处理第二个请求
有点搞不明白,还是说进程是因为第一个请求有同步io的逻辑才使得进程阻塞无法去处理第二个请求?
假如不使用同步io的函数阻塞进程,是不是可以使得一个进程并发执行多个请求的业务逻辑?

1080 2 3
2个回答

walkor 打赏

没有同步阻塞IO就是并发处理请求

gangpula32

我觉得在单worker进程下,也不考虑协程就是老版本workerman,无论onMessage里有没有阻塞io,上一个请求的onMessage里的业务代码还没执行完,应该都是没法处理下一个请求的,单wokrer进程里只有单线程呀。

个人理解,单进程里单线程情况下,worker进程里唯一的那个线程不是在事件循环里等待新请求,就是在onMessage里处理请求,在事件循环里一旦有新请求,马上就能去onMessage。但是这个请求的onMessage执行的过程中有新请求,让线程半途而废回到事件循环里处理新请求,我觉得办不到。

可以实验一下,onMessage里写一段会运行好几秒的一大段非阻塞io代码,看看到底行不行


我上面描述的有问题,单worker进程情况下,
应该是onMessage里面有阻塞io代码,
或者是一段会运行好几秒的不含任何io的代码比如for一个超大数组这种阻塞代码,
这两种情况是排队的。
而onMessage里面有异步非阻塞io的时候可以并发。

  • walkor 2025-09-01

    非阻塞编程本质就是在onMessage里给某个描述符添加可读可写回调,设置回调本身是内存操作不耗时。
    假设A请求到来后要异步读redis,给redis设置了一个可读回调,请求A的onMessage执行完毕(业务没执行完毕)。
    这时候B请求到来要异步读mysql,给mysql设置了一个可读回调,请求B的onMesage执行完毕(业务没执行完毕)。
    这时候就产生了同一个进程,A B两个请求并发处理的情况。
    事件循环会监听 redis 和 mysql可读事件,可读时触发onMessage里设置的回调,最终完成业务。

  • walkor 2025-09-01

    更复杂一点,例如redis可读回调里设置了mysql可读回调,层层嵌套。并发处理请求效果会更明显。

  • Jonas 2025-09-02

    @walkor,有没有实际一点的例子看看?

  • walkor 2025-09-02

    例如非阻塞调用openai接口

    例如webman异步调用http接口

    这些都是并发处理请求的

  • walkor 2025-09-02

    尤其是非阻塞调用 openai 接口,大模型流式输出一般耗时几秒,如果是fpm进程会被占用几秒,webman这种非阻塞方式就不会卡进程,一个进程可以同时处理成千上万个大模型调用。

  • 小W 2025-09-03

    同一个线程中交替进行,可以理解为逻辑上的并发,回调时是不是仍然会产生阻塞 ?

🔝