master-worker常驻型程序代码修改哪些需要重启master或者worker
之前在yii的项目里用redis作为消息队列,现在很多任务需要延迟需求,于是把之前redis的消息队列替换成了rabbitmq
于是使用yii的yii2-queue这个组件
但是由于提供的yii queue/listen是个单进程的消费,而且也不是守护进程,如果有个任务阻塞,就会对其它的任务有影响,开多个又难以管理
于是使用master-worker的方式 开多个worker干活,master监控worker状态
但是进程常驻的程序 又牵扯到代码修改了重启的问题
比如 在master启动就已经加载到内存的程序代码 不重启master是无法得到修改的变更的
下面例子来演示哪些代码需要重启,哪些不需要
这里使用的是从项目里抽出来的简要的进程管理组件
composer require hkui/process_manager
job.php
class job
{
public function do($obj){
$i=0;
while(true){
$i++;
echo posix_getpid()."=".$i."-job-".A.PHP_EOL;
sleep(2);
$obj->isExit($i);
}
}
}
demo.php
require '../../../vendor/autoload.php';
use ProcessManager\Process;
define("A","456");
class demo extends Process
{
public function runJob($worker, $index)
{
\swoole_set_process_name(sprintf('%s-worker-%d', 'test',$index));
include 'job.php';
$job=new job();
$job->do($this);
}
}
if(count($argv)<3){
exit( "params lost".PHP_EOL);
}
$process_name=$argv[1];
$worker_num=3;
if(isset($argv[3])){
$worker_num=intval($argv[3]);
}
$cmd=$argv[2];
$config=[
'process_name'=>$process_name,
'worker_num'=>$worker_num,
'out_file'=>'/tmp/out',
'max_run_time'=>10 //运行10个后自己退出,然后master补上
];
$process=new demo($config);
echo posix_getpid().PHP_EOL;
$process->run($cmd);
开启1个master3个worker
php demo.php test start 3
[root@6fb38402a4c6 process_manager]# php demo.php test status
9982
Array
(
[0] => 9979 9980 9981
[1] => USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[2] => root 9882 0.0 0.1 144952 7420 ? Ss 08:42 0:00 test-master
[3] => root 9979 0.0 0.1 147004 9212 ? S 08:49 0:00 \_ test-worker-1
[4] => root 9980 0.0 0.1 147004 9212 ? S 08:49 0:00 \_ test-worker-2
[5] => root 9981 0.0 0.1 147004 9212 ? S 08:49 0:00 \_ test-worker-0
)
修改常量A的值,worker在重启(运行满10次 或者执行 php demo.php test reload) 后,输出的结果不会体现出A的修改变更
但是修改
job.php里runJob里的输出,worker在重启后会执行最新的代码
如果我们把 include 'job.php'; 拿到外面
demo部分替换成
define("A","456");
include 'job.php';
class demo extends Process
{
public function runJob($worker, $index)
{
\swoole_set_process_name(sprintf('%s-worker-%d', 'test',$index));
$job=new job();
$job->do($this);
}
}
这时修改job代码后,worker重启也不会生效了
runJob里的代码都是子进程worker里的代码
我们在最开始版本的demo代码里
打印下print_r(get_included_files());
define("A","456");
class demo extends Process
{
public function runJob($worker, $index)
{
print_r(get_included_files());
\swoole_set_process_name(sprintf('%s-worker-%d', 'test',$index));
include 'job.php';
$job=new job();
$job->do($this);
}
}
得到
Array
(
[0] => /www/process/vendor/hkui/process_manager/demo.php
[1] => /www/process/vendor/autoload.php
[2] => /www/process/vendor/composer/autoload_real.php
[3] => /www/process/vendor/composer/ClassLoader.php
[4] => /www/process/vendor/composer/autoload_static.php
[5] => /www/process/vendor/hkui/process_manager/src/Process.php
)
这时job.php并没有加载到内存里
所以每次woker重启,new job时 都会加载最新的job.php代码 ,而常量A在demo.php里定义,已经加载到了内存,所以改A必须重启master才能生效
如果把 include 'job.php'; define("A","456"); 下面,这时的get_included_files() 为
Array
(
[0] => /www/process/vendor/hkui/process_manager/demo.php
[1] => /www/process/vendor/autoload.php
[2] => /www/process/vendor/composer/autoload_real.php
[3] => /www/process/vendor/composer/ClassLoader.php
[4] => /www/process/vendor/composer/autoload_static.php
[5] => /www/process/vendor/hkui/process_manager/job.php
[6] => /www/process/vendor/hkui/process_manager/src/Process.php
)
修改job内容 worker重启后new Job 不再加载job.php,而是从父进程master继承 所以不会生效,必须重启父进程master
master-worker常驻型程序代码修改哪些需要重启master或者worker的更多相关文章
- HOOK大法实现不修改程序代码给程序添加功能
[文章标题]: HOOK大法实现不修改程序代码给程序添加功能[文章作者]: 0x18c0[软件名称]: Scylla[使用工具]: OD.Stub_PE.ResHacker[版权声明]: 本文原创于0 ...
- 如何快速读懂大型C++程序代码
要搞清楚别人的代码,首先,你要了解代码涉及的领域知识,这是最重要的,不懂领域知识,只看代码本身,不可能搞的明白.其次,你得找各种文档:需求文档(要做什么),设计文档(怎么做的),先搞清楚你即将要阅读是 ...
- wemall app商城源码中基于PHP的通用的树型类代码
wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...
- 小程序代码包压缩 策略&方案
微信小程序自推出以来,逐渐发展,目前正受到越来越多的青睐.其中很重要的一点得益于小程序的轻量级特性,每个小程序最多不超过2MB,招之即来挥之即去,相比于几十上百兆的APP,用户进入小程序,或者说,小程 ...
- Spark闭包 | driver & executor程序代码执行
Spark中的闭包 闭包的作用可以理解为:函数可以访问函数外部定义的变量,但是函数内部对该变量进行的修改,在函数外是不可见的,即对函数外源变量不会产生影响. 其实,在学习Spark时,一个比较难理解的 ...
- am335x UART1输入u-boot 调试信息代码修改
AM335x 调试信息UART1输出代码修改1. 关于pin_mux 的配置代码修改位置:/board/forlinx/ok335x/mux.c void enable_uart0_pin_mux( ...
- C程序之修改Windows的控制台颜色(转载)
Windows的CMD可以和Linux下的终端一样可以有五颜六色,目前我在网上找到2种方法可以修改Windows的CMD,当然都是在代码中修改的.在“CMD”->“属性”->“颜色”,这种 ...
- 反编译工具 使用.NET JustDecompile来反编译你的程序代码
原文地址:http://www.it165.net/pro/html/201310/7383.html 前言 在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序 ...
- C++ Primer Plus(第6版)中文版——课后练习程序代码
博客内容经历了一次整理,以前发的博文太散.没什么水准,搞的随笔分类越来越多orz,这次把CPP这本书的课后练习的程序代码放到一起方便查阅与修改..嗯 9.6.1 #ifndef _9..1_H_ #d ...
随机推荐
- 安装Windows和Ubuntu双系统2
安装Windows和Ubuntu双系统 0.552016.12.10 15:54:41字数 2101阅读 6644 这几天开始动手做毕设啦,打算好好过把Linux瘾,接下来便是这两天我在联想电脑上安装 ...
- PCA分析的疑问
R 与python scikit-learn PCA的主成分结果有部分是反的 通过R和python分别计算出来的PCA的结果存在某些主成分的结果是相反的,这些结果是没有问题的,只是表示这个分量被反转了 ...
- HDOJ-1100 Trees made to order
一.题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1100 二.题目分析 对二叉树的所有形态顺序编号,编号规则是:节点数越多的编号越大:节点数相等,左子 ...
- memset 导致的一个段错误
原型: void *memset(void *s, int c, size_t n); 解释: memset :是 逐字节 拷贝,即n是指整个变量所占字节,在用于数组时一定要注意n不一定是 数组元素. ...
- PAT(B) 1048 数字加密(Java)字符串
题目链接:1048 数字加密 (20 point(s)) 题目描述 本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运 ...
- C++ 数组和vector的基本操作
1.静态数组的基本操作 int a[5] = {0, 3, 4, 6, 2}; 1.1 数组的遍历 1.1.1 传统的for循环遍历 int size = sizeof(a) / sizeof(*a) ...
- 【Linux】一步一步学Linux——Linux版本(03)
目录 00. 目录 01. Linux内核版本 02. Linux内核官方网站 03. Linux发行版本 04. Linux发行版本介绍 4.1 Ubuntu 4.2 RedHat 4.3 Debi ...
- WEB学习路线2019完整版(附视频教程+网盘下载地址)
WEB学习路线2019完整版(附视频教程+网盘下载地址).适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利.高薪水的职业了.所以现在学习web前端开发的技术人员也是 ...
- IEEE754浮点数
前言 Go语言之父Rob Pike大神曾吐槽:不能掌握正则表达式或浮点数就不配当码农! You should not be permitted to write production code if ...
- 【转载】使用Class.getResource和ClassLoader.getResource方法获取文件路径
自从转投Java阵营后,一直发下Java程序的路径读取异常麻烦,因此查阅了比较多的版本内容,整合了一份自己的学习笔记.主要使用Class及通过ClassLoader来动态获取文件路径. 查阅链接如下: ...