第二章:Task & Timer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DarkAngel1228/article/details/82053988

一.Task

1.工作原理

这里写图片描述

Worker通过调用task()方法发送数据到Task进程
Task进程会在onTask回调中接收到数据并进行处理
处理完成之后,调用finish函数或者直接ruturn返回给Worker进程
Worker进程在onFinish()函数接收到消息并处理。

2.代码实践

async_server.php

$serv = new swoole_server("127.0.0.1", 9501); 

//设置异步任务的工作进程数量 
$serv->set(array('task_worker_num' => 4)); 

$serv->on('receive', function($serv, $fd, $from_id, $data) { 
    //投递异步任务 
    $task_id = $serv->task($data); 
    echo "Dispath AsyncTask: id=$task_id\n"; 
}); 

//处理异步任务 
$serv->on('task', function ($serv, $task_id, $from_id, $data) { 
    echo "New AsyncTask[id=$task_id]".PHP_EOL; 
    //返回任务执行的结果 
    $serv->finish("$data -> OK"); 
}); 

//处理异步任务的结果 
$serv->on('finish', function ($serv, $task_id, $data) { 
    echo "AsyncTask[$task_id] Finish: $data".PHP_EOL; 
}); 

$serv->start(); 

async_client.php

<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); 

//注册连接成功回调 
$client->on("connect", function($cli) { 
    $cli->send("hello world\n"); 
}); 

//注册数据接收回调 
$client->on("receive", function($cli, $data){ 
    echo "Received: ".$data."\n"; 
}); 

//注册连接失败回调 
$client->on("error", function($cli){ 
    echo "Connect failed\n"; 
}); 

//注册连接关闭回调 
$client->on("close", function($cli){ 
    echo "Connection close\n"; 
}); 

//发起连接 
$client->connect('127.0.0.1', 9501, 0.5); 

3.Task常见问题

  • Task传递数据大小
    • 数据小于8k,直接通过管道传递;
    • 数据大于8k,写入临时文件传递;
  • Task传递对象
    • 可以通过序列化传递一个对象的拷贝;
    • Task中对对象的改变不会反映到Worker进程中;
    • 数据库连接、网络连接对象不可传递;
  • Task的onFinish回调
    • Task的onFinish回调会回调给调用task方法的Worker进程(原路返回可寻)

二.Timer

这里写图片描述
- 基于 Reactor线程(在Task Worker中使用系统定时器)
- Timer基于epoll的timeout机制实现
- 使用堆存放Timer,提高检索效率

//每隔2000ms触发一次 
swoole_timer_tick(2000, function ($timer_id) { 
    echo "tick-2000ms\n"; 
}); 

//3000秒后执行此函数 
swoole_timer_after(3000, function () { 
    echo "after 3000ms.\n";
}); 

猜你喜欢

转载自blog.csdn.net/DarkAngel1228/article/details/82053988