Fetch the repository succeeded.
//这是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
是同步的没错,但是task存在的意义在于处理并发时,防止没有协程话的操作产生阻塞,导致处理并发的能力下降。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
同步的话这个task有什么意义。。。
https://www.hyperf.wiki/2.2/#/zh-cn/task
现阶段 Swoole 暂时没有办法 hook 所有的阻塞函数,也就意味着有些函数仍然会导致 进程阻塞,从而影响协程的调度,此时我们可以通过使用 Task 组件来模拟协程处理,从而达到不阻塞进程调用阻塞函数的目的,本质上是仍是是多进程运行阻塞函数,所以性能上会明显地不如原生协程,具体取决于 Task Worker 的数量。
这里的channel阻塞了,为啥要这样写呢?
Sign in to comment