Swoft2.x 小白学习笔记 (三) --- Task、协程
介绍swoft中
1、Task
2、协程
一:Task任务:
1、配置,在 app/bean.php文件中加入
'httpServer' => [
// ...
'on' => [
SwooleEvent::TASK => \bean(TaskListener::class), // Enable task must task and finish event
SwooleEvent::FINISH => \bean(FinishListener::class)
],
/* @see HttpServer::$setting */
'setting' => [
'task_worker_num' => 12,
'task_enable_coroutine' => true,
'worker_num' => 2
]
],
2、定时任务
1、安装 composer require swoft/crontab
2、配置
'httpServer' => [
// ...
'process' => [
'crontab' => bean(Swoft\Crontab\Process\CrontabProcess::class)
],
// ...
], 3、定义,在/app/Task/Crontab/ 文件夹中新建文件 <?php namespace App\Task\Crontab; use Swoft\Crontab\Annotaion\Mapping\Cron;
use Swoft\Crontab\Annotaion\Mapping\Scheduled; /**
* Class DemoCronTask
* @package App\Task\Crontab
*
* @Scheduled(name="demoCronTask") //声明定时任务
*/
class DemoCronTask{ /**
* @Cron("*") //每秒执行
*/
public function secondTask(){
var_dump("--111----",date('Y-m-d H:i:s', time()));
} /**
* @Cron("0 * * * * *") //每分钟执行
*/
public function miunteTask(){
var_dump("222------",date('Y-m-d H:i:s', time()));
}
}
3、协程、异步任务
(1)、声明一个任务,在 /app/Task/Task/ 文件夹新建文件
<?php declare(strict_types=1); namespace App\Task\Task; use Swoft\Task\Annotation\Mapping\Task;
use Swoft\Task\Annotation\Mapping\TaskMapping; /**
* Class DemoTask
*
* @since 2.0
* @Task(name="demoV2Task") //标记类是一个任务
*/
class DemoTask
{
/**
* @TaskMapping(name="list") //映射名称
*
* @param int $id
* @param string $default
*
* @return array
*/
public function getList(int $id): array
{
var_dump("------------"); sleep(5); return [
'list' => [1, 3, 3],
'id' => $id
];
} /**
* @param int $id
* @return bool
*
* @TaskMapping(name="putLists")
*/
public function putList(int $id) : bool
{
if($id > 5)
return true; return false;
}
}
(2)、任务投递
// 协程投递
$data = Task::co('demoV2Task', 'list', [12]); //异步投递
$data = Task::async('demoV2Task', 'list', [12]);
(3)、异步投递如果需要关注异步任务处理结果,可以添加监听器,在文件夹 /app/Task/Listener/ 下新建文件
<?php namespace App\Task\Listener; use Swoft\Log\Helper\CLog;
use function context;
use Swoft\Event\Annotation\Mapping\Listener;
use Swoft\Event\EventHandlerInterface;
use Swoft\Event\EventInterface;
use Swoft\Task\TaskEvent; /**
* Class DemoListener
* @package App\Task\Listener
* @Listener(event=TaskEvent::FINISH) //参数必须带Finsh
*/
class DemoListener implements EventHandlerInterface{ /**
* @param EventInterface $event
*
* @throws \Swoft\Exception\SwoftException
*/
public function handle(EventInterface $event): void
{
// TODO: Implement handle() method.
$fId = context()->getTaskUniqid(); // var_dump($fId);
CLog::info(\context()->getTaskUniqid()); $taskData = context()->getTaskData();
// var_dump($taskData); CLog::info(\context()->getTaskData());
}
}
二:协程 : https://www.swoft.org/docs/2.x/zh-CN/common/co.html
use Swoft\Co;
//创建一个协程
Co::create(function(){
// to do
sleep(3);
var_dump("--2222----"); }); //并发
$request = [
'method' => function () {
sleep(8); return "";
},
'staticMethod' => function () {
sleep(5); return "";
},
'closure' => function () {
sleep(2); return "";
}
]; $resd = Co::multi($request);//同时执行,同步,会阻塞
注意:Task中有两个地方还未清楚
1、协程投递任务时是阻塞( $data = Task::co('demoV2Task','list',[2],10); )。
2、使用 Co::multi() 执行并发时会阻塞。
3、异步监听的地方,所有监听器只有带了参数 @Listener(event=TaskEvent::FINISH) 都会执行一遍。
查看文档:
Task : https://www.swoft.org/docs/2.x/zh-CN/task/index.html
协程 : https://www.swoft.org/docs/2.x/zh-CN/common/co.html
Swoft2.x 小白学习笔记 (三) --- Task、协程的更多相关文章
- Swoft2.x 小白学习笔记 (一) ---控制器
Swoft通过官方文档进行学习,这里不做介绍,直接上手. 涉及到Swoft方面:(配置.注意的坑) 1.控制器(路由.验证器.中间件) 2.mysql (Model使用).Redis配置及通用池 3 ...
- lua学习笔记13:协程具体解释和举例
一.coroutine.create创建协程 參数是协程的主函数,返回一个thread对象 co = coroutine.create(function() print("coroutine ...
- Swoft2.x 小白学习笔记 (二) --- mysql、redis
介绍swoft中 1.mysql. 2.Redis 一.mysql使用: 1.配置,在 app\bean.php文件中 'db' => [ 'class' => Database::cla ...
- Swoft2.x 小白学习笔记 (四) --- RPC
介绍 swoft 中 RPC使用:搭建访问服务端和客户端 RPC服务端: 一.配置,在文件 /app/bean.php中添加 return [ 'rpcServer' => [ 'class' ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
随机推荐
- Linux之静态库
命名规则: lib + 库的名字 + .a 制作步骤 生成对应.o文件 .c à .o 将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o 发布 ...
- [Vue] : Vue实例的声明周期
vue实例的生命周期 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子:就是生命周期事件的别名而已: 生命周期钩子 = 生命周期函 ...
- ANDROID_ID
在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置.可以通过下面的方法获取: i ...
- Linux设备驱动程序 之 顺序锁
当要保护的资源很小,很简单,会频繁的被访问而且写入访问很少的且必须快速时(即读不允许让写饥饿),就可以使用顺序锁(seqlock):从本质上讲,顺序锁会允许读取者对资源的自由访问,但需要读取者检查是否 ...
- Linux设备驱动程序 之 重要数据结构
文件对象 文件对象是进程已经打开文件描述符的内存中的表示,单个文件可能有多个表示打开文件描述符的file结构: struct file { union { struct llist_node fu_l ...
- 提交本地文件至gitlab已有的项目中(更新gitlab)
gitlab代码更新 gitlab官网 1.安装git git官网 官网下载安装,安装过程一直next即可(路径自己选) 2.clone至本机 格式:git clone url(可转到指定目录克隆) ...
- MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁
1.锁的分类 1.1从对数据操作的类型来分 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响. 结论1: --如果某一个会话 对A表加了read锁,则 该会话 可以对A表进行读操作 ...
- vscode 设置 eclipse 快捷键
点击安装之后,默认就是要ecliplse快捷键了 注意:部分快捷键可能会由于和原来的冲突而失效,例如快速在“下面插入行” ,我还是不能使用ecliplse的Shift+Enter,而要用Ctrl+En ...
- spring boot系列(六)spring boot 配置mybatis(xml简化版)
orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sql的mybatis,两者各有特点,在企业级系统开 ...
- lumen返回网站base url
可以使用全局帮助函数url() echo url(); //输出http://test.domain.com