# webman 和 workerman 在运行模式上是否有所区别?

staraxy

webman 和 workerman 在运行模式上是否有所区别?

对于 workerman 的疑问

按照我的理解,workerman 的运行模式应该是 多进程+eventloop(事件循环) 的事件驱动编程模型,每个进程都有自己的事件循环队列,以此来达到异步非阻塞,一个进程能够同时维持上千条连接的效果。

那么 workerman 应该是真正意义上的异步吧?,我的疑问是:

当前进程如果收到了第一个用户的请求,然后为了处理这个用户的请求,此进程又向另一台服务器发起了一个异步请求。

在等待该异步请求的响应的这段时间,第一个用户的请求还未完成,那么这个进程是否可以去处理第二个用户的请求,在收到先前那个异步请求的响应之后再去调用对应的回调函数,给予第一个用户响应。

我想说的是一个进程是否可以做到一个请求还未彻底完成(该请求正在等待某些异步非阻塞 IO 的结果)的情况下就去处理第二个请求。

我觉得基于 eventloop 的 workerman 上面说的这些 workerman 应该是可以做到的吧?。希望有人能够回答我的疑问,十分感谢。

对于 webman 的疑问

如果上面所说 workerman 可以做到,那么既然 webman 是基于 workerman 的,webman 在处理请求时也是不是也能够做到:

第一个用户的请求还未彻底完成,没有释放连接(在等待某些异步非阻塞 IO 结果)的情况下,开始去处理第二个用户的请求,然后等到第一个用户的异步非阻塞 IO 有结果时,去通知回调返回给第一个用户响应,然后再接着去处理第二个用户的请求?

我之前一直认为 webman 是基于 workerman 的,那肯定是可以的,直到我无意中看到一篇文章:workerman - webman 体验及性能压测 - 个人文章 SegmentFault 思否 。这篇文章中讲到 webman 是多进程阻塞的,而且并没有 workerman 的事件循环(eventloop)。

和我之前的认知有很大的不同,就产生了一些疑问:

  1. webman 有 workerman 那样的事件循环吗?如果有的话,为什么这篇文章中说 webman 是阻塞的,没有 eventloop ?

  2. 在 webman 中,如果我在处理第一个用户请求的时候使用了异步非阻塞 IO ,那么这个进程可以在第一个用户请求还没有完成,连接还没有释放的情况下去处理第二个用户的请求吗?

  3. 还是说在第一个用户请求还没有彻底完成返回响应的情况下,即使使用了异步非阻塞 IO ,当前进程闲置(不知道这样说是否合适),也无法去处理第二个用户的请求,使用异步非阻塞 IO 只不过加快了单次请求的处理速度?

  4. 还是说不管是否使用异步非阻塞 IO ,不管当前进程是否空闲,只要第一个用户的请求没有完成返回响应,就无法去开始处理第二个用户的请求?

网上看了很多文章,或许是因为问题过于简单?并没有找到任何比较明确的答复。我相信应该不止我一个人会有这些疑问。

424 2 1
2个回答

胡桃
  1. 有;事件循环只是实现用户线程(协程)的基础,然而绝大部分玩家在使用Workerman处理IO时还是用的PHP原生的阻塞函数。所以真实原因是他自己只会用阻塞函数,然后说Webman是阻塞的。
  2. 可以。(现在就是,建议阅读Workerman源码。)
  3. 异步不能提高单次请求速度。如果一个请求涉及到读取数据库,将耗时0.1秒,异步只是将等待的数据库的0.1秒主动让出去执行其他用户线程,而不是让CPU空转0.1秒,这个完整的请求还是需要至少0.1秒才能响应给客户端。
  4. 否。你说的是FPM。

恐怕只有你一个人有这些疑问。

nitron

异步只是提高单位时间内的吞吐量,不能提高单次处理速度

  • staraxy 2024-01-11

    有可能用户的一次请求,会需要多个数据库的查询操作,然后合并这多个查询操作的结果组成 json 响应,返回给用户。那你说对于这单次请求的两个不同数据库的查询操作而言,是同步阻塞执行这两个查询操作的速度快还是异步执行这两个查询操作的速度快。

  • nitron 2024-01-11

    理想状况是异步快

  • nitron 2024-01-11

    但是总耗时是不会变的,合并耗时+多次查询耗时

  • staraxy 2024-01-11

    那么如果是同步阻塞的话是不是意味着第一次查询发起之后,要等待第一次查询完成,才能去进行第二次查询,这种同步阻塞情况下是不是会有一段等待第一次查询完成的时间。

  • nitron 2024-01-11

    是的,但我感觉你还是没理解我表达的意思

  • staraxy 2024-01-11

    你想表达的应该是对于程序的执行而言,程序非空闲时间的总和是不变的。我想说的是单个请求从请求到整个响应所花费的时间。

🔝