介绍swoft中

  1、Task

  2、协程

一:Task任务:

  1、配置,在 app/bean.php文件中加入

  1. 'httpServer' => [
  2. // ...
  3. 'on' => [
  4. SwooleEvent::TASK => \bean(TaskListener::class), // Enable task must task and finish event
  5. SwooleEvent::FINISH => \bean(FinishListener::class)
  6. ],
  7. /* @see HttpServer::$setting */
  8. 'setting' => [
  9. 'task_worker_num' => 12,
  10. 'task_enable_coroutine' => true,
  11. 'worker_num' => 2
  12. ]
  13. ],

  2、定时任务

  1. 1、安装 composer require swoft/crontab
  2. 2、配置
  3. 'httpServer' => [
  4. // ...
  5. 'process' => [
  6. 'crontab' => bean(Swoft\Crontab\Process\CrontabProcess::class)
  7. ],
  8. // ...
  9. ],
  10.  
  11. 3、定义,在/app/Task/Crontab/ 文件夹中新建文件
  12.  
  13. <?php
  14.  
  15. namespace App\Task\Crontab;
  16.  
  17. use Swoft\Crontab\Annotaion\Mapping\Cron;
  18. use Swoft\Crontab\Annotaion\Mapping\Scheduled;
  19.  
  20. /**
  21. * Class DemoCronTask
  22. * @package App\Task\Crontab
  23. *
  24. * @Scheduled(name="demoCronTask") //声明定时任务
  25. */
  26. class DemoCronTask{
  27.  
  28. /**
  29. * @Cron("*") //每秒执行
  30. */
  31. public function secondTask(){
  32. var_dump("--111----",date('Y-m-d H:i:s', time()));
  33. }
  34.  
  35. /**
  36. * @Cron("0 * * * * *") //每分钟执行
  37. */
  38. public function miunteTask(){
  39. var_dump("222------",date('Y-m-d H:i:s', time()));
  40. }
  41. }

3、协程、异步任务

  (1)、声明一个任务,在 /app/Task/Task/ 文件夹新建文件

  1. <?php declare(strict_types=1);
  2.  
  3. namespace App\Task\Task;
  4.  
  5. use Swoft\Task\Annotation\Mapping\Task;
  6. use Swoft\Task\Annotation\Mapping\TaskMapping;
  7.  
  8. /**
  9. * Class DemoTask
  10. *
  11. * @since 2.0
  12. * @Task(name="demoV2Task") //标记类是一个任务
  13. */
  14. class DemoTask
  15. {
  16. /**
  17. * @TaskMapping(name="list") //映射名称
  18. *
  19. * @param int $id
  20. * @param string $default
  21. *
  22. * @return array
  23. */
  24. public function getList(int $id): array
  25. {
  26. var_dump("------------");
  27.  
  28. sleep(5);
  29.  
  30. return [
  31. 'list' => [1, 3, 3],
  32. 'id' => $id
  33. ];
  34. }
  35.  
  36. /**
  37. * @param int $id
  38. * @return bool
  39. *
  40. * @TaskMapping(name="putLists")
  41. */
  42. public function putList(int $id) : bool
  43. {
  44. if($id > 5)
  45. return true;
  46.  
  47. return false;
  48. }
  49. }

(2)、任务投递

  1. // 协程投递
  2. $data = Task::co('demoV2Task', 'list', [12]);
  3.  
  4. //异步投递
  5. $data = Task::async('demoV2Task', 'list', [12]);

(3)、异步投递如果需要关注异步任务处理结果,可以添加监听器,在文件夹 /app/Task/Listener/ 下新建文件

  1. <?php
  2.  
  3. namespace App\Task\Listener;
  4.  
  5. use Swoft\Log\Helper\CLog;
  6. use function context;
  7. use Swoft\Event\Annotation\Mapping\Listener;
  8. use Swoft\Event\EventHandlerInterface;
  9. use Swoft\Event\EventInterface;
  10. use Swoft\Task\TaskEvent;
  11.  
  12. /**
  13. * Class DemoListener
  14. * @package App\Task\Listener
  15. * @Listener(event=TaskEvent::FINISH) //参数必须带Finsh
  16. */
  17. class DemoListener implements EventHandlerInterface{
  18.  
  19. /**
  20. * @param EventInterface $event
  21. *
  22. * @throws \Swoft\Exception\SwoftException
  23. */
  24. public function handle(EventInterface $event): void
  25. {
  26. // TODO: Implement handle() method.
  27. $fId = context()->getTaskUniqid();
  28.  
  29. // var_dump($fId);
  30. CLog::info(\context()->getTaskUniqid());
  31.  
  32. $taskData = context()->getTaskData();
  33. // var_dump($taskData);
  34.  
  35. CLog::info(\context()->getTaskData());
  36. }
  37. }

二:协程 : https://www.swoft.org/docs/2.x/zh-CN/common/co.html

  1. use Swoft\Co;

  2. //创建一个协程
  3.   Co::create(function(){
  4.    // to do
  5.    sleep(3);
  6.    var_dump("--2222----");
  7.  
  8.   });
  9.  
  10. //并发
  11. $request = [
  12. 'method' => function () {
  13. sleep(8);
  14.  
  15. return "";
  16. },
  17. 'staticMethod' => function () {
  18. sleep(5);
  19.  
  20. return "";
  21. },
  22. 'closure' => function () {
  23. sleep(2);
  24.  
  25. return "";
  26. }
  27. ];
  28.  
  29. $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、协程的更多相关文章

  1. Swoft2.x 小白学习笔记 (一) ---控制器

    Swoft通过官方文档进行学习,这里不做介绍,直接上手. 涉及到Swoft方面:(配置.注意的坑) 1.控制器(路由.验证器.中间件) 2.mysql  (Model使用).Redis配置及通用池 3 ...

  2. lua学习笔记13:协程具体解释和举例

    一.coroutine.create创建协程 參数是协程的主函数,返回一个thread对象 co = coroutine.create(function() print("coroutine ...

  3. Swoft2.x 小白学习笔记 (二) --- mysql、redis

    介绍swoft中 1.mysql. 2.Redis 一.mysql使用: 1.配置,在 app\bean.php文件中 'db' => [ 'class' => Database::cla ...

  4. Swoft2.x 小白学习笔记 (四) --- RPC

    介绍 swoft 中 RPC使用:搭建访问服务端和客户端 RPC服务端: 一.配置,在文件 /app/bean.php中添加 return [ 'rpcServer' => [ 'class' ...

  5. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  6. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  7. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  8. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  9. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

随机推荐

  1. Pytest学习笔记(二) 用例执行规则

    在用pytest执行用例时,可以按照如下场景来执行 1.执行目录及其子目录下的所有用例 pytest filename\ 2.执行某一个py文件下的用例 pytest filename.py 3.-k ...

  2. [Alg] 二叉树的非递归遍历

    1. 非递归遍历二叉树算法 (使用stack) 以非递归方式对二叉树进行遍历的算法需要借助一个栈来存放访问过得节点. (1) 前序遍历 从整棵树的根节点开始,对于任意节点V,访问节点V并将节点V入栈, ...

  3. Leetcode题目236.二叉树的最近公共祖先(中等)

    题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先 ...

  4. 让一个小的div在大的div中居中显示

    原文 实现原理是设置margin自动适应,然后设置定位的上下左右都为0. 就如四边均衡受力从而实现盒子的居中: 代码: .parent { width:800px; height:500px; bor ...

  5. 邻居子系统 之 状态定时器回调neigh_timer_handler

    概述 在分配邻居子系统之后,会设置定时器来处理那些需要定时器处理的状态,定时器回调函数为neigh_timer_handler:函数会根据状态机变换规则对状态进行切换,切换状态后,如果需要更新输出函数 ...

  6. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  7. putty简易教程

    和xshell相比,putty除了每次登陆时需要鉴权之外,基本上体验都差不多,由于putty以命令行操作方式为主,因此使用效率上会略高于xshell. 1.下载 下载地址1:(最新版) https:/ ...

  8. Python-sympy科学计算与数据处理(方程,微分,微分方程,积分)

    方程 a,b,c,x = symbols("a b c x") my_eq = Eq(a*x**2+b*x+c,0) solve(my_eq,x) Out[12]: [(-b + ...

  9. spring boot系列(七)spring boot 使用mongodb

    1 pom.xml配置 增加包依赖:spring-boot-starter-data-mongodb <dependency> <groupId>org.springframe ...

  10. JAVA 基础编程练习题8 【程序 8 输入数字求和】

    8 [程序 8 输入数字求和] 题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字.例如 2+22+222+2222+22222(此时共有 5 个 数相加),几个数相加 ...