正在显示
4 个修改的文件
包含
83 行增加
和
56 行删除
@@ -22,64 +22,61 @@ function start(){ | @@ -22,64 +22,61 @@ function start(){ | ||
22 | // 初始时,进行一次统计 | 22 | // 初始时,进行一次统计 |
23 | $table->set('etotal',['val'=> db()->count(\Model\email::count())]); | 23 | $table->set('etotal',['val'=> db()->count(\Model\email::count())]); |
24 | 24 | ||
25 | -// 启动一个进程池进行管理 | ||
26 | - $topPool = new Process\Pool(WORKER_NUM); | ||
27 | - | ||
28 | - // 每10分钟统计一次邮箱数量 | ||
29 | - $timer_id = \Swoole\Timer::tick(600,function () use (&$table){ | ||
30 | - $table->set('etotal',['val'=> db()->count(\Model\email::count())]); | ||
31 | - }); | 25 | + // 进程管理器 |
26 | + $pm = new Process\Manager(); | ||
27 | + | ||
28 | + // 启动一个进程来管理定时 | ||
29 | + $pm->add(function (Process\Pool $pool, int $workerId)use (&$table){ | ||
30 | + _echo("进程({$workerId})启动成功"); | ||
31 | + // 每10分钟统计一次邮箱数量 | ||
32 | + \Swoole\Timer::tick(600000,function () use (&$table){ | ||
33 | + $table->set('etotal',['val'=> db()->count(\Model\email::count())]); | ||
34 | + }); | ||
32 | 35 | ||
33 | - // 每2秒执行一次 | ||
34 | - $timer_check_id = \Swoole\Timer::tick(2,function () use (&$table,$topPool){ | ||
35 | - // 是否停止脚本 | ||
36 | - $table->set('stop',['val'=> redis()->get(RUNNING_REDIS_KEY) === 'stop' ? 1 : 0]); | ||
37 | - | ||
38 | - // 检查是否结束了所有的协程同步代码 | ||
39 | - if ($table->get('stop','val')) { | ||
40 | - $stop_num = 0; | ||
41 | - foreach (range(0, WORKER_NUM) as $i) { | ||
42 | - if ($table->exists('ps' . $i)) { | ||
43 | - $stop_num++; | 36 | + // 每2秒执行一次 |
37 | + \Swoole\Timer::tick(2000,function () use (&$table,&$pool){ | ||
38 | + // 是否停止脚本 | ||
39 | + $table->set('stop',['val'=> redis()->get(RUNNING_REDIS_KEY) === 'stop' ? 1 : 0]); | ||
40 | +// _echo('定时器'); | ||
41 | + // 检查是否结束了所有的协程同步代码 | ||
42 | + if ($table->get('stop','val')) { | ||
43 | + $stop_num = 0; | ||
44 | + foreach (range(0, WORKER_NUM) as $i) { | ||
45 | + if ($table->exists('ps' . $i)) { | ||
46 | + $stop_num++; | ||
47 | + } | ||
44 | } | 48 | } |
45 | - } | ||
46 | - if($stop_num >= WORKER_NUM){ | 49 | + if($stop_num >= WORKER_NUM){ |
47 | // 退出进程 | 50 | // 退出进程 |
48 | - $topPool->shutdown(); | 51 | + $pool->shutdown(); |
52 | + } | ||
49 | } | 53 | } |
50 | - } | ||
51 | 54 | ||
52 | - // 邮件总数 | ||
53 | - $total = redis()->get('email_total',0); | ||
54 | - if($total > $table->get('etotal','val')){ | ||
55 | - $table->set('etotal',['val'=> $total]); | ||
56 | - } | 55 | + // 邮件总数 |
56 | + $total = redis()->get('email_total',0); | ||
57 | + if($total > $table->get('etotal','val')){ | ||
58 | + $table->set('etotal',['val'=> $total]); | ||
59 | + } | ||
57 | 60 | ||
58 | - }); | 61 | + }); |
59 | 62 | ||
63 | + // 进行阻塞,否则定时器无法运行 | ||
64 | + while (true){ | ||
65 | + co::sleep(9999); | ||
66 | + } | ||
67 | + },true); | ||
60 | 68 | ||
61 | 69 | ||
62 | - // 这个是启用协程 | ||
63 | - $topPool->set(['enable_coroutine' => true]); | ||
64 | - // 协程配置 | 70 | +// 协程配置 |
65 | \co::set([ | 71 | \co::set([ |
66 | 'max_coroutine'=>COROUTINE_MAX_NUM, // 最大携程数量 | 72 | 'max_coroutine'=>COROUTINE_MAX_NUM, // 最大携程数量 |
67 | 'hook_flags'=>SWOOLE_HOOK_TCP, // redis需要的配置 | 73 | 'hook_flags'=>SWOOLE_HOOK_TCP, // redis需要的配置 |
68 | ]); | 74 | ]); |
69 | 75 | ||
70 | - // 开始工作 | ||
71 | - $topPool->on('WorkerStart',function (Process\Pool $pool,$worker_id) use (&$table){ | 76 | + // 启动业务进程 |
77 | + $pm->addBatch(WORKER_NUM,function (Process\Pool $pool, int $worker_id) use (&$table){ | ||
72 | _echo("进程({$worker_id})启动成功"); | 78 | _echo("进程({$worker_id})启动成功"); |
73 | 79 | ||
74 | - // 是否停止,这里进行阻塞 | ||
75 | - if ($table->get('stop','val')){ | ||
76 | - // 某个进程退出了 | ||
77 | - $table->set('ps'.$worker_id,['val'=>1]); | ||
78 | - | ||
79 | - co::sleep(1); | ||
80 | - return true; | ||
81 | - } | ||
82 | - | ||
83 | // 协程id集 | 80 | // 协程id集 |
84 | $cid = []; | 81 | $cid = []; |
85 | 82 | ||
@@ -132,19 +129,25 @@ function start(){ | @@ -132,19 +129,25 @@ function start(){ | ||
132 | // 跳出无限循环了 | 129 | // 跳出无限循环了 |
133 | if(!$cid){ | 130 | if(!$cid){ |
134 | _echo('正常关闭进程('.$worker_id.')'); | 131 | _echo('正常关闭进程('.$worker_id.')'); |
135 | - // 关闭当前进程 | ||
136 | -// $pool->shutdown(); | ||
137 | break; | 132 | break; |
138 | } | 133 | } |
139 | } | 134 | } |
140 | 135 | ||
141 | - }); | ||
142 | - // 停止工作后的回调 | ||
143 | - $topPool->on('WorkerStop', function (\Swoole\Process\Pool $pool, $workerId) { | ||
144 | - _echo("[Worker #{$workerId}] WorkerStop\n"); | ||
145 | - }); | 136 | + // 是否停止,这里进行阻塞 |
137 | + if ($table->get('stop','val')){ | ||
138 | + // 某个进程退出了 | ||
139 | + $table->set('ps'.$worker_id,['val'=>1]); | ||
140 | + // 阻塞直到 主进程 kill掉所有子进程 | ||
141 | + while (true){ | ||
142 | + co::sleep(5); | ||
143 | + } | ||
144 | + } | ||
145 | + | ||
146 | + | ||
147 | + },true); | ||
148 | + | ||
146 | 149 | ||
147 | - $topPool->start(); | 150 | + $pm->start(); |
148 | 151 | ||
149 | } | 152 | } |
150 | 153 | ||
@@ -165,7 +168,7 @@ function create_coroutine(array &$cid,int &$isRunMaxCNum,$worker_id){ | @@ -165,7 +168,7 @@ function create_coroutine(array &$cid,int &$isRunMaxCNum,$worker_id){ | ||
165 | while (true){ | 168 | while (true){ |
166 | // 是否退出协程 | 169 | // 是否退出协程 |
167 | if(!$isRunMaxCNum){ | 170 | if(!$isRunMaxCNum){ |
168 | - _echo('协程('.co::getCid().'): stop '.$isRunMaxCNum); | 171 | +// _echo('协程('.co::getCid().'): stop '.$isRunMaxCNum); |
169 | break; | 172 | break; |
170 | } | 173 | } |
171 | 174 | ||
@@ -182,8 +185,8 @@ function create_coroutine(array &$cid,int &$isRunMaxCNum,$worker_id){ | @@ -182,8 +185,8 @@ function create_coroutine(array &$cid,int &$isRunMaxCNum,$worker_id){ | ||
182 | } | 185 | } |
183 | 186 | ||
184 | // 协程完成后执行的函数 | 187 | // 协程完成后执行的函数 |
185 | - co::defer(function () use (&$cid){ | ||
186 | - _echo('正常关闭协程('.co::getCid().')'); | 188 | + co::defer(function () use (&$cid,$worker_id){ |
189 | + _echo('正常关闭进程('.$worker_id.')下的协程('.co::getCid().')'); | ||
187 | unset($cid[co::getCid()]); | 190 | unset($cid[co::getCid()]); |
188 | }); | 191 | }); |
189 | 192 |
demo.php
已删除
100644 → 0
运行说明.必看.md
0 → 100644
-
请 注册 或 登录 后发表评论