107 Star 943 Fork 160

GVPhyperf / hyperf

 / 详情

hyperf中task 是一个同步的操作吗?难道底层用的是 taskWait? 我的测试 task是一个类似同步的结果

待办的
创建于  
2021-09-06 23:51

//这是Task类

<?php
namespace App\Task;
use Hyperf\Task\Annotation\Task;
use Hyperf\Utils\Coroutine;

class MytestTask{
    /**
     * @Task()
     */
    public function sendMail($username,$cid){
        echo "cid=".$cid."currentCid".Coroutine::id();
        sleep(3);
        echo "我是来发邮件的".PHP_EOL;
        return "ok, 我发完了".$username."hahah";
    }
    
    /**
     * @Task()
     */
    public function sendMsg($username,$cid){
        echo "cid=".$cid."currentCid".Coroutine::id();
        sleep(3);
        echo "我给".$username."发信息".PHP_EOL;
        return "OK,".$username;
    }
}

然后在控制器中 注入并调用

    /**
     * @Inject()
     * @var MytestTask
     */
    protected $task;
    public function testtask(){
        //$mytestTask = ApplicationContext::getContainer()->get(MytestTask::class);
        $cid = Coroutine::id();
        $result =$this->task->sendMail("huangjunhui",$cid);
        $result2 = $this->task->sendMsg("gonglinmei",$cid);
        var_dump($result);
        var_dump($result2);
        return "ok111";
    }

最终的结里是同步的, 直到 var_dump() 打印完成才 输出 ok111

输入图片说明

评论 (5)

663574953 创建了任务
663574953 关联仓库设置为hyperf/hyperf
展开全部操作日志

是同步的没错,但是task存在的意义在于处理并发时,防止没有协程话的操作产生阻塞,导致处理并发的能力下降。

同步的话这个task有什么意义。。。

https://www.hyperf.wiki/2.2/#/zh-cn/task

现阶段 Swoole 暂时没有办法 hook 所有的阻塞函数,也就意味着有些函数仍然会导致 进程阻塞,从而影响协程的调度,此时我们可以通过使用 Task 组件来模拟协程处理,从而达到不阻塞进程调用阻塞函数的目的,本质上是仍是是多进程运行阻塞函数,所以性能上会明显地不如原生协程,具体取决于 Task Worker 的数量。

输入图片说明
这里的channel阻塞了,为啥要这样写呢?

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(6)
1653262 sy records 1578956935 697726 huangcom 1578931033
PHP
1
https://gitee.com/hyperf/hyperf.git
git@gitee.com:hyperf/hyperf.git
hyperf
hyperf
hyperf

搜索帮助