- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解PHP swoole process的使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
引入背景:假如我们每天有10000个订单生成,需要同步到仓储系统中去,以前做法是开启一个crontab去跑这些任务,但是发现总有感觉同步效率低,间隔时间都是分钟级别的.
解决方案测试:我们将同步订单的任务表添加一个hash作为key,作为分发条件,因为mysql中select如果做mod函数是用不到索引的,所以我们自己做随机hash,但是务必不需要范围太大,以免服务器资源不够,方法是根据hashkey投放到不同的进程中进行同步,测试代码如下 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
<?php
/**
* Created by PhpStorm.
* User: xujun
* Date: 2017/8/26
* Time: 9:37
*/
//假定需要处理的数据如下
class
Process{
public
$mpid
=0;
public
$max_precess
=5;
//代替从数据库中读取的内容
public
$task
= [
[
'uid'
=>1,
'uname'
=>
'bot'
,
'hash'
=>1,
'handle'
=>
'test'
],
[
'uid'
=>2,
'uname'
=>
'bot1'
,
'hash'
=>2,
'handle'
=>
'test'
],
[
'uid'
=>3,
'uname'
=>
'bot2'
,
'hash'
=>3,
'handle'
=>
'test'
],
[
'uid'
=>4,
'uname'
=>
'bot3'
,
'hash'
=>4,
'handle'
=>
'test'
],
[
'uid'
=>2,
'uname'
=>
'bot4'
,
'hash'
=>2,
'handle'
=>
'test'
],
[
'uid'
=>3,
'uname'
=>
'bot5'
,
'hash'
=>3,
'handle'
=>
'test'
],
[
'uid'
=>4,
'uname'
=>
'bot6'
,
'hash'
=>1,
'handle'
=>
'test'
],
];
public
$works
= [];
public
$swoole_table
= NULL;
//public $new_index=0;
function
test(
$index
,
$task
){
print_r(
"["
.
date
(
'Y-m-d H:i:s'
).
"]"
.
'work-index:'
.
$index
.
'处理'
.
$task
[
'uname'
].
'完成'
.PHP_EOL);
}
public
function
__construct(){
try
{
$this
->swoole_table =
new
swoole_table(1024);
$this
->swoole_table->column(
'index'
, swoole_table::TYPE_INT);
//用于父子进程间数据交换
$this
->swoole_table->create();
swoole_set_process_name(sprintf(
'php-ps:%s'
,
'master'
));
$this
->mpid = posix_getpid();
$this
->run();
$this
->processWait();
}
catch
(\Exception
$e
){
die
(
'ALL ERROR: '
.
$e
->getMessage());
}
}
public
function
run(){
for
(
$i
=0;
$i
<
$this
->max_precess;
$i
++) {
$this
->CreateProcess();
}
}
private
function
getTask(
$index
){
$_return
= [];
foreach
(
$this
->task
as
$v
){
if
(
$v
[
'hash'
]==
$index
){
$_return
[] =
$v
;
}
}
return
$_return
;
}
public
function
CreateProcess(
$index
=null){
if
(
is_null
(
$index
)){
//如果没有指定了索引,新建的子进程,开启计数
$index
=
$this
->swoole_table->get(
'index'
);
if
(
$index
=== false){
$index
= 0;
}
else
{
$index
=
$index
[
'index'
]+1;
}
print_r(
$index
);
}
$this
->swoole_table->set(
'index'
,
array
(
'index'
=>
$index
));
$process
=
new
swoole_process(
function
(swoole_process
$worker
)
use
(
$index
){
swoole_set_process_name(sprintf(
'php-ps:%s'
,
$index
));
$task
=
$this
->getTask(
$index
);
foreach
(
$task
as
$v
){
call_user_func_array(
array
(
$this
,
$v
[
'handle'
]),
array
(
$index
,
$v
));
}
sleep(20);
}, false, false);
$pid
=
$process
->start();
$this
->works[
$index
]=
$pid
;
return
$pid
;
}
public
function
rebootProcess(
$ret
){
$pid
=
$ret
[
'pid'
];
$index
=
array_search
(
$pid
,
$this
->works);
if
(
$index
!==false){
$index
=
intval
(
$index
);
$new_pid
=
$this
->CreateProcess(
$index
);
echo
"rebootProcess: {$index}={$new_pid} Done\n"
;
return
;
}
throw
new
\Exception(
'rebootProcess Error: no pid'
);
}
public
function
processWait(){
while
(1) {
if
(
count
(
$this
->works)){
$ret
= swoole_process::wait();
if
(
$ret
) {
$this
->rebootProcess(
$ret
);
}
}
else
{
break
;
}
}
}
}
$process
=
new
Process();
|
这里代码中,使用了swoole_table作为进程间共享的内存,为了分配index。以及当进程退出后,父进程通过wait重新拉起该进程任务.
测试截图 。
进程ps 。
结果 休眠20s后退出后会被自动拉起 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/gavinjunftd/p/7434846.html 。
最后此篇关于详解PHP swoole process的使用方法的文章就讲到这里了,如果你想了解更多关于详解PHP swoole process的使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
我是一名设计老师,试图帮助学生应对编程挑战,所以我编码是为了好玩,但我不是专家。 她需要找到 mode (最常见的值)在使用耦合到 Arduino 的传感器的数据构建的数据集中,然后根据结果激活一些功
我正在开发一个应用程序,该应用程序提供 CPU 使用率最高的 5 个应用程序名称。目前,我通过以下代码获得了排名前 5 的应用程序: var _ = require('lodash');
互联网上很少有例子涉及这个问题的所有三个问题——即 set-process-sentinel ; set-process-filter ;和 start-process . 我尝试了几种不同的方法来微
如 this post 中所述,在 C# 中有两种调用另一个进程的方法。 Process.Start("hello"); 和 Process p = new Process(); p.StartInf
我试图让我的桨从白色变为渐变(线性),并使球具有径向渐变。感谢您的帮助!您可以在 void drawPaddle 中找到桨的代码。 这是我的目标: 这是我的代码: //球 int ballX = 50
考虑:流程(a)根据我的文字: A process is first entered at the time of simulation, at which time it is executed u
我真的希望 Processing 有用于处理数组的 push 和 pop 方法,但由于它没有,我不得不试图找出删除数组中特定位置的对象的最佳方法。我相信这对很多人来说都是基本的,但我可以使用一些帮助,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
以编程方式,我如何确定 Windows 10 中的 3 个类别 应用 后台进程 Windows 服务 就像任务管理器一样? 即我需要一些 C# 代码,我可以确定应用程序列表与后台进程列表。检查 Win
当我导入 node:process它工作正常。但是,当我尝试要求相同时,它会出错。 这工作正常: import process from 'node:process'; 但是当我尝试要求相同时,它会引
我正在上一门使用处理的类(class)。 我在理解 map() 函数时遇到问题。 根据它的文档( http://www.processing.org/reference/map_.html ): Re
我试图执行: composer.phar update 并收到: Fatal error: Allowed memory size of 94371840 bytes exhausted (tried
给定一堆二维图像,如何使用 Processing/Processing.js 产生体积渲染效果? 目前我的想法是使用 java(类似于 imageJ)进行体积渲染 -> 获取体积渲染图像的面作为单独的
这是代码示例 var startInfo = new ProcessStartInfo { Arguments = commandStr, FileName = @"C:\Window
当我在 Processing(草图 > 导入库 > 添加库)中添加库时,它安装在哪里? 最佳答案 它们安装在您的 中速写本位置 . 您可以通过转到"file">“首选项”来查看和更改您的速写本位置。草
无聊的好奇... 我正在查看当前进程的一些属性: using(Process p = Process.GetCurrentProcess()) { // Inspect properties
我正在尝试在同一页面上运行多个草图。 初始化脚本指定: /* * This code searches for all the * in your page and loads each scrip
Process.Kill 后是否需要使用 Process.WaitForExit? 如果调用进程在调用 Process.Kill 后立即退出怎么办? 这会导致 Process.Kill 失败吗? 编辑
我尝试使用处理从麦克风获取频率。我混合了文档中的两个示例,但“最高”并不是真正的赫兹(a 是 440 赫兹)。 你知道如何拥有比这更好的东西吗? import ddf.minim.*; import
我是一名优秀的程序员,十分优秀!