# 同步任务-Task task用作执行一些耗时操作,或者同步客户端,task本身是同步的,不能使用异步方法,task中也不能调用task。 ## 创建一个Task 继承Task类。 ``` class TestTask extends Task { public function test_task() { $testModel = $this->loader->model('TestModel', $this); $result = $testModel->test(); print_r($result); } } ``` Task中可以调用Model,但是该Model有限制,不能有异步的API命令(redis,mysql框架会自动转换为同步模式,所以可以使用) ## 调用一个Task ``` $testTask = $this->loader->task(TestTask::class, $this); $result = $testTask->test(); ``` 可以直接访问Task,task的执行是异步的,不会堵塞worker进程。 也可以设置更丰富的协程属性 ``` $testTask->call("test",[],-1,function (TaskCoroutine $taskCoroutine){ $taskCoroutine->setTimeout(1000); }); ``` 也可以使用回调 ``` $testTask->startTask("test",[],-1,function ($result){ //result是结果 }); ``` >上面的方法的回调函数是异步执行的,那时可能调用这个task的控制器和模型已经被销毁了。 如果仅仅是通知Task执行某个任务不想获得结果可以使用startTask方法,并将回调函数设置为null。 ## 限制 Task是同步进程,限制很多: 1.不能使用异步客户端 2.不能使用进程间通信 >Sub/Pub基于进程间通信实现的,所以不能在Task中使用