swoole_server->taskwait [编辑本页]

函数原型:

function Server->taskwait(mixed $data, float $timeout = 0.5, int $dstWorkerId = -1) : string | bool

taskwaittask方法作用相同,用于投递一个异步的任务到task进程池去执行。与task不同的是taskwait是阻塞等待的,直到任务完成或者超时返回。 $result为任务执行的结果,由$serv->finish函数发出。如果此任务超时,这里会返回false

taskwait是阻塞接口,如果你的Server是全异步的请使用swoole_server::taskswoole_server::finish,不要使用taskwait
第3个参数可以指定要给投递给哪个task进程,传入ID即可,范围是0 - serv->task_worker_num
$dstWorkerId1.6.11以上版本可用,可以指定目标Task进程的ID,默认为-1表示随机投递
taskwait方法不能在task进程中调用

特例

如果onTask中没有任何阻塞IO操作,底层仅有2次进程切换的开销,并不会产生IO等待,因此这种情况下 taskwait 可以视为非阻塞。实际测试onTask中仅读写PHP数组,进行10万次taskwait操作,总耗时仅为1秒,平均每次消耗为10微秒


  • 何志清

    既然都是同步阻塞为什么不直接在当前进程中执行代码呢?taskwait 存在意义在哪里?

  • 去也来来

    实例代码中的mysql连接池就使用了taskwait,在类似的场景中很有意义。

  • 何志清

    意义在哪里呢

  • 董红帅

    我也想知道,异步阻塞的意义在哪里,或者谁能举个实际应用的场景出来?

  • 阿健AJSoft

    异步阻塞的意义就在于那个timeout参数,比如建立某个连接或者发送消息之类的操作,需要同步阻塞,但是又必须有超时值以进行错误处理的时候。 建议timeout参数的单位改为ms.

  • luffy

    呃,说白那就是一个等待时间设置是吗? 如果超过timeout时间返回false是吧? 但我想知道的是比如我设置了 0.1秒超时,超过了这个时间之后taskwait 里的代码还会执行吗?

  • luffy

    测试了一下。 会往下去执行,不过超时会报一个这样的错误,这是什么鬼?

    PHP Warning: swoole_server::taskwait(): taskwait failed. Error: Resource temporarily unavailable[11] in /home/luffy/app/swoole-test/test-taskwait.php on line 13

    Warning: swoole_server::taskwait(): taskwait failed. Error: Resource temporarily unavailable[11] in /home/luffy/app/swoole-test/test-taskwait.php on line 13

  • 李强

    一样的问题....

  • 呼吸二氧化碳

    任务进程回调函数不能 return null 否则会报错

  • 卖掉内裤去上网

    一样的问题。

  • 钟云昶

    问题找到原因了吗

  • 卖掉内裤去上网

    解决了,

    用这个方法:

    $server->after($timeout, function() use($server, $data){ $server->task($data); });

  • 钟云昶

    谢谢~