• 异步任务
    • 任务投递
    • 任务上下文
    • 异步任务结果
    • 异步任务完成上下文

    异步任务

    异步任务一般用于不需要结果的场景且异步区执行,不影响主流程。如下异步任务投递:

    1. use Swoft\Task\Task;
    2. $data = Task::async('testTask', 'list', [12]);
    3. $data = Task::async('testTask', 'delete', [12]);

    任务投递

    1. Task::async(string $name, string $method, array $params = [], array $ext = [], int $dstWorkerId = -1, callable $fallback = null)

    异步任务投递,返回一个全局唯一的任务ID

    • name 投递任务任务名称
    • method 投递任务的方法名称
    • params 任务传递的参数即是任务方法的参数,数组格式传递
    • ext 任务扩展信息,会传递给任务进程里面
    • dstWorkerId 投递的进程 workerId,默认底层按需选择进程 workerId

    任务上下文

    任务上下文和协程任务章节讲解的完全一样

    异步任务结果

    有很多情况不需要关注异步任务处理结果,但是也有部分场景需要关注异步任务处理结果,框架为开发者提供了一种事件监听的方式来处理异步任务结果。此事件和普通事件完全一样。如下定义是事件监听:

    1. use Swoft\Event\Annotation\Mapping\Listener;
    2. use Swoft\Event\EventHandlerInterface;
    3. use Swoft\Event\EventInterface;
    4. use Swoft\Log\Helper\CLog;
    5. use Swoft\Task\TaskEvent;
    6. /**
    7. * Class FinishListener
    8. *
    9. * @since 2.0
    10. *
    11. * @Listener(event=TaskEvent::FINISH)
    12. */
    13. class FinishListener implements EventHandlerInterface
    14. {
    15. /**
    16. * @param EventInterface $event
    17. */
    18. public function handle(EventInterface $event): void
    19. {
    20. CLog::info(\context()->getTaskUniqid());
    21. }
    22. }
    • 事件必须监听 TaskEvent::FINISH
    • 如果需要获取数据可以从上下文中获取,注意此时获取的是任务完成的上下文对象与任务上下对象不一样。

    异步任务完成上下文

    在异步任务完成监听器里面可以通过 content() 全局函数获取上下文 Swoft\Task\FinishContext 对象。

    1. $taskData = context()->getTaskData();
    2. $taskId = context()->getTaskId();
    3. $taskUniqid = context()->getTaskUniqid();
    4. $server = context()->getServer();
    • getTaskData 任务处理的结果内容
    • getTaskId 任务 ID,对应 Swoole 任务 ID
    • getTaskUniqid 全局任务唯一ID,框架生成,与任务投递时的全局任务ID一样
    • getServer 获取任务 Server 相关信息