🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Server->taskwait [TOC] 函数原型: ~~~ function Server->taskwait(mixed $data, float $timeout = 0.5, int $dstWorkerId = -1) : string | bool ~~~ `taskwait`与`task`方法作用相同,用于投递一个异步的任务到`task`进程池去执行。与`task`不同的是`taskwait`是同步等待的,直到任务完成或者超时返回。`$result`为任务执行的结果,由`$serv->finish`函数发出。如果此任务超时,这里会返回`false`。 * 第`1`个参数为投递的任务数据,可以是任意类型,非字符串类型底层会自动进行串化 * 第`2`个参数为超时时间,浮点型,单位为秒,最小支持`1ms`粒度,超过规定时间内`Task`进程未返回数据,`taskwait`将返回`false`,不再处理后续的任务结果数据 * 第`3`个参数可以指定要给投递给哪个`Task`进程,传入`ID`即可,范围是`0 - serv->task_worker_num` * `$dstWorkerId`在`1.6.11`以上版本可用,可以指定目标`Task`进程的`ID`,默认为-1表示随机投递,底层会自动选择一个空闲`Task`进程 > `4.0.4`以下版本中`taskwait`是阻塞接口,如果你的`Server`是全异步的请使用`swoole_server::task`和`swoole_server::finish`,不要使用`taskwait` > `4.0.4`以上版本中`taskwait`底层会进行协程调度,实现完全的异步`IO` > `taskwait`方法不能在`task`进程中调用 ## 协程模式 从`4.0.4`版本开始`taskwait`方法将支持协程调度,在协程中调用`Server->taskwait()`时将自动进行协程调度,不再阻塞等待。 借助协程调度器,`taskwait`可以实现并发调用。 ## 同步模式 在同步阻塞模式下,`taskwait`需要使用管道通信和共享内存,将数据返回给`Worker`进程,这个过程是同步阻塞的。 ## 特例 如果`onTask`中没有任何阻塞IO操作,底层仅有2次进程切换的开销,并不会产生IO等待,因此这种情况下`taskwait`可以视为非阻塞。实际测试`onTask`中仅读写PHP数组,进行10万次`taskwait`操作,总耗时仅为`1秒`,平均每次消耗为`10微秒`