之前在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的更多相关文章

  1. HOOK大法实现不修改程序代码给程序添加功能

    [文章标题]: HOOK大法实现不修改程序代码给程序添加功能[文章作者]: 0x18c0[软件名称]: Scylla[使用工具]: OD.Stub_PE.ResHacker[版权声明]: 本文原创于0 ...

  2. 如何快速读懂大型C++程序代码

    要搞清楚别人的代码,首先,你要了解代码涉及的领域知识,这是最重要的,不懂领域知识,只看代码本身,不可能搞的明白.其次,你得找各种文档:需求文档(要做什么),设计文档(怎么做的),先搞清楚你即将要阅读是 ...

  3. wemall app商城源码中基于PHP的通用的树型类代码

    wemall doraemon是Android客户端程序,服务端采用wemall微信商城,不对原商城做任何修改,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可随意定制修改.本文分享其中 ...

  4. 小程序代码包压缩 策略&方案

    微信小程序自推出以来,逐渐发展,目前正受到越来越多的青睐.其中很重要的一点得益于小程序的轻量级特性,每个小程序最多不超过2MB,招之即来挥之即去,相比于几十上百兆的APP,用户进入小程序,或者说,小程 ...

  5. Spark闭包 | driver & executor程序代码执行

    Spark中的闭包 闭包的作用可以理解为:函数可以访问函数外部定义的变量,但是函数内部对该变量进行的修改,在函数外是不可见的,即对函数外源变量不会产生影响. 其实,在学习Spark时,一个比较难理解的 ...

  6. am335x UART1输入u-boot 调试信息代码修改

    AM335x 调试信息UART1输出代码修改1. 关于pin_mux  的配置代码修改位置:/board/forlinx/ok335x/mux.c void enable_uart0_pin_mux( ...

  7. C程序之修改Windows的控制台颜色(转载)

    Windows的CMD可以和Linux下的终端一样可以有五颜六色,目前我在网上找到2种方法可以修改Windows的CMD,当然都是在代码中修改的.在“CMD”->“属性”->“颜色”,这种 ...

  8. 反编译工具 使用.NET JustDecompile来反编译你的程序代码

    原文地址:http://www.it165.net/pro/html/201310/7383.html 前言 在项目的进行中有时会碰到需要去了解由第三方所开发的程序代码或者因为年久已经遗失原始码的程序 ...

  9. C++ Primer Plus(第6版)中文版——课后练习程序代码

    博客内容经历了一次整理,以前发的博文太散.没什么水准,搞的随笔分类越来越多orz,这次把CPP这本书的课后练习的程序代码放到一起方便查阅与修改..嗯 9.6.1 #ifndef _9..1_H_ #d ...

随机推荐

  1. C#等比例缩放图片

    等比例缩放图片(C#) private Bitmap ZoomImage(Bitmap bitmap, int destHeight, int destWidth) { try { System.Dr ...

  2. spark源码阅读 RDDs

    RDDs弹性分布式数据集 spark就是实现了RDDs编程模型的集群计算平台.有很多RDDs的介绍,这里就不仔细说了,这儿主要看源码. abstract class RDD[T: ClassTag]( ...

  3. 使用静态方法CreateInstance()创建数组

    Array类是一个抽象类,所以不能使用构造函数来创建数组.但除了可以使用C#语法创建数组的实例之外,还可以使用静态方法CreateInstance()创建数组. 如果事先不知道元素的类型,该静态方法就 ...

  4. feign学习笔记

    使用:

  5. [转帖]TPC-C基准测试之链路层优化

    TPC-C基准测试之链路层优化 阿里数据库 6000万 TPMC的测试结构. http://www.itpub.net/2019/10/14/3436/ 作者:易鸿伟 闫建良 王光树 在 TPC-C ...

  6. Python中的if语句——参考Python编程从入门到实践

    条件测试 1. 检查是否相等 一个等号表示赋值,两个等号用于判断等号左右两边是否相等,返回值为True或者False. 2. 检查是否相等是需考虑大小写 大小写不同的值视为不相等,例如继续写入代码:c ...

  7. PAT(B) 1054 求平均值(Java)

    题目链接:1054 求平均值 (20 point(s)) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的.一个"合法"的输 ...

  8. vs2017环境下python包的安装

    1)---vs已经下载了的才适用 1,鼠标放在右侧窗口python环境那里(如没有窗口,可点击最上方的“窗口”-“重置窗口”) 2,右键然后点击“查看所有python环境”,会弹出当前默认的环境(高亮 ...

  9. Spring Boot集成Mybatis完整实例

    步骤: 添加Mybatis依赖: 添加数据库依赖: 配置属性文件: (具体的属性名称可以在jar包中找到) 内容: 建表sql: Mapper文件的头: 集成Mybatis的配置文件中的具体内容可以在 ...

  10. JQuery EasyUI框架

    1. JQuery EasyUI框架概述 1.1. JQuery EasyUI是什么东西 答:JQuery  EasyUI就是一套基础JQuery的富客户端的UI框架.像这些将常用的控件封装成一个UI ...