zoukankan      html  css  js  c++  java
  • Swoft2.x 小白学习笔记 (三) --- Task、协程

    介绍swoft中

      1、Task

      2、协程

    一:Task任务:

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

      'httpServer' => [
            // ...
            'on'       => [
                SwooleEvent::TASK   => ean(TaskListener::class),  // Enable task must task and finish event
                SwooleEvent::FINISH => ean(FinishListener::class)
            ],
            /* @see HttpServer::$setting */
            'setting'  => [
                'task_worker_num'       => 12,
                'task_enable_coroutine' => true,
                'worker_num'            => 2
            ]
        ],
    View Code

      2、定时任务

    1、安装 composer require swoft/crontab
    2、配置
     'httpServer'     => [
                // ...
                'process' => [
                    'crontab' => bean(SwoftCrontabProcessCrontabProcess::class)
                ],
                // ...
            ],
    
    3、定义,在/app/Task/Crontab/ 文件夹中新建文件
    
    <?php
    
    namespace AppTaskCrontab;
    
    use SwoftCrontabAnnotaionMappingCron;
    use SwoftCrontabAnnotaionMappingScheduled;
    
    /**
     * Class DemoCronTask
     * @package AppTaskCrontab
     *
     * @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()));
        }
    }
    View Code

         3、协程、异步任务

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

    <?php declare(strict_types=1);
    
    namespace AppTaskTask;
    
    use SwoftTaskAnnotationMappingTask;
    use SwoftTaskAnnotationMappingTaskMapping;
    
    /**
     * 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;
        }
    }
    View Code

           (2)、任务投递

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

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

    <?php
    
    namespace AppTaskListener;
    
    use SwoftLogHelperCLog;
    use function context;
    use SwoftEventAnnotationMappingListener;
    use SwoftEventEventHandlerInterface;
    use SwoftEventEventInterface;
    use SwoftTaskTaskEvent;
    
    /**
     * Class DemoListener
     * @package AppTaskListener
     * @Listener(event=TaskEvent::FINISH)  //参数必须带Finsh
     */
    class DemoListener implements EventHandlerInterface{
    
        /**
         * @param EventInterface $event
         *
         * @throws SwoftExceptionSwoftException
         */
        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());
        }
    }
    View Code

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

    use SwoftCo;
    
    //创建一个协程   Co::create(function(){   
    // to do    sleep(3);    var_dump("--2222----");   }); //并发 $request = [ 'method' => function () { sleep(8); return "111"; }, 'staticMethod' => function () { sleep(5); return "2222"; }, 'closure' => function () { sleep(2); return "3333"; } ]; $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 

        

  • 相关阅读:
    不用加减乘除做加法
    求1+2+3+...+n
    孩子们的游戏(圆圈中最后剩下的数)
    扑克牌顺子
    翻转单词顺序列
    左旋转字符串
    和为S的两个数字
    和为S的连续正数序列
    毕设进度12
    毕设进度11
  • 原文地址:https://www.cnblogs.com/cj8988/p/11607593.html
Copyright © 2011-2022 走看看