原文档中:添加的定时任务在当前进程执行(不会启动新的进程或者线程),如果任务很重(特别是涉及到网络IO的任务),可能会导致该进程阻塞,暂时无法处理其它业务
实际运行下来,发现是非阻塞的。
$worker->count = 1;
$worker->onMessage = function (\Workerman\Connection\TcpConnection $connection, \Workerman\Protocols\Http\Request $request) {
\Workerman\Timer::add(10, function()use($connection){
echo "aaaa".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
\Workerman\Timer::add(5, function()use($connection){
echo "bbb".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
// 向浏览器发送hello world
$connection->send('hello world'.date("Y-m-d H:i:s"));
};
\Workerman\Worker::runAll();
浏览器同时发起了9个请求
页码同时返回收到hell word
然后再执行完两个定时器
\Workerman\Timer::add(1, function()use($connection){
sleep(15);
echo "aaaa ".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
\Workerman\Timer::add(1, function()use($connection){
sleep(5);
echo "bbb ".date("Y-m-d H:i:s").PHP_EOL;
}, null, false);
客户端并发请求
客户端每隔1秒请求
你的$connection->send("hello world")能耗费多少时间?
你要不要把"Y-m-d H:i:s"换成毫秒看看呢?
你理解错了,9个请求同时请求 同时返回,定时器没有起到阻塞作用 @walkor
哥啊,这单个请求的处理时间顶天10ms甚至不到,9个加起来也就顶天100ms, 你的输出的时间最小单位是秒,1秒有1000ms呢,打毫秒出来就是的意义就在这里
echo "aaaa".date("Y-m-d H:i:s").PHP_EOL;
不是很重的业务
在定时器中增加sleep 15秒,还是同时返回了,看截图(追加了一张)。我看了下响应头有长连接标识,单进程,共享一个连接, 应该是阻塞呀
另一个问题:整个周期都不能使用sleep吗,想主动阻塞下怎么处理比较好
我觉得你没理解定时器的含义。按照你的代码,第1个请求到达服务端,服务端设置定时器1秒后执行sleep。然后紧接着第2个请求过来了,这时候可能才过了10ms,远没达到1秒,还没到执行sleep的时候,那么第2个请求也能被处理,同理其它请求也一样
如果你进程只有你自己用,你sleep多少秒都行,如果不是,那么你sleep的时候其他用户就没办法正常执行业务了。
同时请求这个点 确实被我忽略了,重新整理了下逻辑,web端每隔一秒发出请求,还是不会阻塞,先返回客户端,然后再执行定时器中的逻辑。回到最初的问题,就是想模拟下 阻塞时如何发生的。目前看是同步非阻塞的。追加了一张新图
发下完整代码,包括操作系统,workerman版本
检查发现是开启了eventLoop(后边弄了下协程 忘了关了),按照你说的逻辑,没问题。 当前开启定时器的请求非阻塞,下一次请求会被阻塞。thinks👍