이 글은 시간이 많이 걸리는 작업을 처리하기 위해 swoole에서 작업 프로세스를 사용하는 방법을 소개합니다. 이는 swoole 프레임워크를 배우는 학생들에게 도움이 되기를 바랍니다.
Swoole에서 작업 프로세스를 사용하여 시간이 많이 걸리는 작업을 처리하는 방법은 무엇입니까?
Swoole에는 마스터 메인 프로세스와 매니저 관리 프로세스라는 두 가지 주요 프로세스가 있다는 것을 알고 있습니다.
마스터 메인 프로세스에는 메인 리액터 스레드와 여러 개의 리액터 스레드가 있습니다. 주요 기능은 TCP 연결을 유지하고, 네트워크 IO를 처리하고, 데이터를 보내고 받는 것입니다.
관리자는 프로세스를 관리하며 그 역할은 작업자 및 작업 프로세스를 포크하고 관리하는 것입니다.
작업자 프로세스의 기능은 리액터 스레드가 전달한 데이터를 받아 데이터를 처리하고 처리 결과를 리액터 스레드로 반환하는 것입니다.
작업 프로세스의 역할은 상대적으로 시간이 많이 걸리는 작업을 처리하는 것입니다. 작업 프로세스는 작업자 프로세스와 독립적이며 작업자 프로세스의 클라이언트 요청 처리에 영향을 미치지 않습니다.
1. 작업 프로세스의 적용 시나리오:
1. 1백만 명의 사용자에게 이벤트 이메일을 보내야 하는 특정 이벤트와 같이 상대적으로 시간이 많이 걸리는 대량 메일 발송.
2. 특정 빅 V의 업데이트를 푸시하세요. 예를 들어 빅 V가 새 메시지를 게시하면 팬들은 제때에 업데이트를 받아야 합니다.
추천 학습: swoole tutorial
2. 작업자와 작업의 관계:
1 작업자 프로세스는 task()를 호출하여 작업을 전달할 수 있으며, 작업 프로세스는 전달된 작업에 onTask를 통해 응답합니다. 이벤트 태스크.
2. 작업 프로세스에서는 직접 반환하거나 Finish()를 호출하여 작업이 완료되었음을 작업자 프로세스에 알릴 수 있습니다.
3. 작업 사용을 위한 전제 조건:
1. 서버에서 task_worker_num 수를 구성합니다.
2. 서버의 onTask 및 onFinish 이벤트 콜백 기능을 설정합니다.
4 누적 합계를 계산하기 위해 작업을 사용하는 간단한 예
<?php $server = new swoole_server('0.0.0.0', 6666); $server->set([ 'worker_num' => 2, 'task_worker_num' => 16, ]); $server->on('WorkerStart', function ($server, $worker_id) { //注意这里,我们通过taskworker来判断是task进程还是worker进程 //需要在worker进程中调用task(),不然会报出警告 //这里会执行两遍,因为我们设置了worker_num数为2 if (!$server->taskworker) { echo '投递任务开始...', PHP_EOL; //投递32个累加计算任务给16个task进程 for ($ix = 0; $ix < 32; $ix++) { //注意这里的投递是异步的 $server->task([mt_rand(1, 100), mt_rand(1000, 9999)]); } echo '投递任务结束...', PHP_EOL; } }); //server服务必须要有onReceive回调 $server->on('Receive', function ($server, $fd, $reactor_id, $data) { }); //注意,task进程完全是同步阻塞模式的 $server->on('Task', function ($server, $task_id, $src_worker_id, $data) { echo "task {$task_id} 进程正在工作...", PHP_EOL; $start = $data[0]; $end = $data[1]; $total = 0; for (; $start <= $end; $start++) { $total += $start; } echo "task {$task_id} 进程完成工作...", PHP_EOL; return $total; }); $server->on('Finish', function ($server, $task_id, $data) { echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL; }); $server->start();
task()를 호출하여 작업 풀에 작업을 전달하고 swoole의 하위 계층은 각 작업 프로세스에 작업을 폴링하고 전달합니다. .
전달하는 작업 수가 onTask의 처리 속도를 초과하면 작업 풀이 가득 차서 작업자 프로세스가 차단되므로 task_worker_num 수와 처리 속도 간의 관계가 필요합니다. 적절하게 설정되도록 합니다.
물론 지정된 작업 프로세스에 수동으로 작업을 전달할 수도 있습니다. task() 함수의 두 번째 매개변수는 전달할 작업 프로세스 ID를 지정할 수 있으며, ID 범위는 0~(task_worker_num - 1)이다.
5. 작업을 분할하고 작업 프로세스에 대한 전달을 수동으로 제어합니다
<?php $server = new swoole_server('0.0.0.0', 6666); $server->set([ 'worker_num' => 1, 'task_worker_num' => 10, ]); $server->on('WorkerStart', function ($server, $worker_id) { //为了方便演示,把worker_num设置为1,这里只会执行一次 if (!$server->taskworker) { //通过swoole_table共享内存,在不同进程中共享数据 $server->result = new swoole_table(10240); //用于保存task进程完成数量 $server->result->column('finish_nums', swoole_table::TYPE_INT); //用于保存最终计算结果 $server->result->column('result', swoole_table::TYPE_INT); $server->result->create(); //计算1000的累加和,并把计算任务分配到10个task进程上 $num = 1000; $step = $num / $server->setting['task_worker_num']; for ($ix = 0; $ix < $server->setting['task_worker_num']; $ix++) { $start = $ix * $step; $server->task([$start, $start + $step], $ix); } } }); $server->on('Receive', function ($server, $fd, $reactor_id, $data) { }); //注意,task进程完全是同步阻塞模式的 $server->on('Task', function ($server, $task_id, $src_worker_id, $data) { echo "task {$task_id} 进程正在工作... 计算 {$data[0]} - {$data[1]} ", PHP_EOL; $start = ++$data[0]; $end = $data[1]; $total = 0; for (; $start <= $end; $start++) { $total += $start; } echo "task {$task_id} 进程完成工作...", PHP_EOL; return $total; }); $server->on('Finish', function ($server, $task_id, $data) { echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL; $server->result->incr('finish_nums', 'finish_nums'); $server->result->set('result', ['result' => $data + $server->result->get('result', 'result')]); if ($server->result->get('finish_nums', 'finish_nums') == $server->setting['task_worker_num']) { echo "最终计算结果:{$server->result->get('result', 'result')}", PHP_EOL; } }); $server->s tart();
위 내용은 시간이 많이 걸리는 작업을 처리하기 위해 Swoole에서 작업 프로세스를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!