swoole task进程

task进程

 

1.worker进程当中,我们调用对应的task()方法发送数据通知到task worker进程

2.task worker进程会在onTask()回调中接收到这些数据,并进行处理。

3.处理完成之后通过调用finsh()函数或者直接return返回消息给worker进程

4.worker进程在onFinsh()进程收到这些消息并进行处理



参数注意:

$task_id不等于workerStart中的worker_id,而是swoole维护的任务自增长id

$from_id表示来自于哪个woker投递而来的任务,id等于worker_id值

$serv->worker_id等于workerStart中的worker_id, 此处是task_woker的id

$serv->worker_pid 此处是task_woker的进程pid



注意事项:

一、开启task功能

task功能默认是关闭的,开启task功能需要满足两个条件

配置task进程的数量

注册task的回调函数onTask和onFinish

配置task进程的数量,即配置task_worker_num这个配置项。比如我们开启8个task进程,同样task进程数量的配置也不是随意的配置


计算方法

单个task的处理耗时,如100ms,那一个进程1秒就可以处理1/0.1=10个task

task投递的速度,如每秒产生2000个task


2000/10=200,需要设置task_worker_num => 200,启用200个task进程

对于单个服务器的承受数量我们要提前做预知,处理能力必须是大于投放能力的

二 .

task进程的onTask事件中没有调用finish方法或者return结果,worker进程不会触发onFinish

执行onFinish逻辑的worker进程与下发task任务的worker进程是同一个进程

Task常见问题:

1、Task传递数据的大小数据小于8k直接通过管道传递,数据大于8k写入临时文件传递

onTask

会读取这个文件,把他读出来

运行Task,必须要在swoole服务中配置参数task_worker_num,此外,必须给swoole_server绑定两个回调函数:onTask和onFinish。

onTask

要return 数据 

2、Task传递对象默认task只能传递数据,可以通过序列化传递一个对象的拷贝,Task中对象的改变并不会反映到worker进程中数据库连接,网络连接对象不可传递,会引起php报错

3、Task的onFinish回调

Task

的onFinish回调会回调调用task方法的worker进程

4、task_max_request 设置task进程的最大任务数。一个task进程在处理完超过此数值的任务后将自动退出。这个参数是为了防止PHP进程内存溢出。如果不希望进程自动退出可以设置为0

5、每个woker都有可能投递任务给不同的task_worker处理, 不同的woker进程内存隔离,记录着worker_id, 标识woker进程任务处理数量

.task任务切分

      除了直接将数据投递到task,由task分配给某个task进程,如果是投递过来的是数据类型的任务,也可以自己去指定分配进程去处理。【$server->task($data, 2);//0-(task_worker_num-1)】

  场景:假设有一台服务器专门处理前台投递的数据,利用简单的任务拆分,分配到相应的进程去处理

  1.将一个大的任务拆分成相应份数(是由$task_worker_num数量来确定)让其他task进程也参与处理数据

  2.通过foreach循环将数据投递到指定的task进程,范围是(0-(task_worker_num-1))区间之内

  3.执行失败的任务,需要保留,重新投递执行(进程间通讯管道方式)


task_ipc_mode

设置Task进程与Worker进程之间通信的方式。

1, 使用Unix Socket通信,默认模式

2, 使用消息队列通信

3, 使用消息队列通信,并设置为争抢


模式2和模式3使用sysvmsg消息队列通信。

消息队列模式使用操作系统提供的内存队列存储数据,未指定 mssage_queue_key 消息队列Key,将使用私有队列,在Server程序终止后会删除消息队列。

指定消息队列Key后Server程序终止后,消息队列中的数据不会删除,因此进程重启后仍然能取到数据

可使用ipcrm -q 消息队列ID手工删除消息队列数据

模式2和模式3的不同之处是,模式2支持定向投递,$serv->task($data, $task_worker_id) 可以指定投递到哪个task进程。模式3是完全争抢模式,task进程会争抢队列,将无法使用定向投递,task/taskwait将无法指定目标进程ID,即使指定了$task_worker_id,在模式3下也是无效的。

模式3会影响sendMessage方法,使sendMessage发送的消息会随机被某一个task进程获取

你可能感兴趣的:(swoole task进程)