之前在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. flask 密钥问题

    RuntimeError RuntimeError: The session is unavailable because no secret key was set. Set the secret_ ...

  2. springcloud【基于springboot1.x】的简单发布服务和使用

    1.新建一个springboot 1.x项目[2.x之上有bug,就没测试] 就是新建一个注册中心 2.等下载完,注册中心配置application.yml server: port: 8761 eu ...

  3. 浅谈python反序列化漏洞

    最近看到p神一篇讲python反序列化的文章,结合redis未授权访问组合漏洞,感觉在flask和redis的构架中比较常见,便记录下来. p神原文:https://www.leavesongs.co ...

  4. kafka为什么吞吐量高,怎样保证高可用

    1:kafka可以通过多个broker形成集群,来存储大量数据:而且便于横向扩展. 2:kafka信息存储核心的broker,通过partition的segment只关心信息的存储,而生产者只负责向l ...

  5. ASP.NET Core四大部件

    四大部件 (WebHost,Startup,launchSettings,wwwroot) WebHost 简单理解是一个socket, https://www.cnblogs.com/neverc/ ...

  6. 如何将本地的项目添加到github上

    参考链接:http://note.youdao.com/noteshare?id=d0b7990a83b024b0172b6d5c5617a8d0&sub=659F216B9046420991 ...

  7. MySQL新项目如何确保上线安全

    大纲 DBA最应该做的事情 新项目开发环境应该注意什么 功能测试和压力测试MySQL DBA关注点 线上环境关注点 业务在大压力情况下,MySQL如何能活下来 DBA最应该做的事情 备份 建议每天全备 ...

  8. Authentication源码解析

    1.获取当前的 Subject. 调用 SecurityUtils.getSubject(); 从当前线程的threadLocals属性中获取Subject对象 SecurityUtils publi ...

  9. Luogu5290 [十二省联考2019] 春节十二响 【贪心】【堆】

    题目分析: 对于一个根,假设我们对每个子树分别求出了一种答案,那么怎么合并答案是最小的呢? 首先考虑这些答案里面最大的那个数字,它肯定要融合其它组里面的最大数字.以此类推 所以最好的合并方式是,每个子 ...

  10. java 线程同步、死锁

    转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-thread-synchronization.html 什么是线程同步  同步问题的提 ...