繁体   English   中英

子级继承的Python RabbitMQ连接

[英]Python RabbitMQ connection inherited by child

问题如下。 调用执行以下两项操作的python程序:连接到Rabbitmq服务器,并调用产生两个进程的ac程序。

当python程序完成时,仍将建立连接以负责子进程。

因此,当父母去世时,孩子会继承其父母资源。

做一个netstat -putan | grep rabbitmqip netstat -putan | grep rabbitmqip

tcp  0 0 localhost:39744   rabbitmqip:5672 ESTABLISHED 25693/child

这是我在python脚本完成时得到的。

我可以想象在这种情况下连接会丢失。

这似乎发生在与RabbitMQ服务器的连接上,我们无法通过常规的TCP连接进行复制。

以前有人遇到过这个问题吗? 有什么解决方法吗?

python代码将是我的兔子用户,而c程序将是后台的脚本,这些脚本会根据工人的工作而产生或杀死。 当我杀死使用者时,无论刷新是否活跃,我都无法建立连接,因为那样子节点将从队列中获得他们不理解的消息。

代码示例:

Python:

connection = pika.BlockingConnection(pika.ConnectionParameters(host='RabbitServer'))
print ("Starting Child...")
system("/home/path/test/child")
print ("Done")

子程序。

pid_t pstartId, sessionId;

// Fork 1
pstartId = fork();
if (pstartId < 0) {
    printf("The System can not create a proccess. \n");
    perror("fork");
    exit(EXIT_FAILURE);
}

if (pstartId > 0) { exit(EXIT_SUCCESS);}

// Fork 2
pstartId = fork();
if (pstartId < 0) {
    printf("The System can not create a proccess. \n");
    perror("fork");
    exit(EXIT_FAILURE);
}

if (pstartId > 0) {exit(EXIT_SUCCESS);}

if ((sessionId = setsid()) < 0) {
    printf("The System can not set a id session. \n");
    perror("setid");
    exit(EXIT_FAILURE);
}

if (chdir("/") < 0) {
    printf("The System can not change dir /. \n");
    perror("chdir");
    exit(EXIT_FAILURE);
}

while(1){
    syslog(LOG_INFO, "I'm a child");
    sleep(1);
}

当您通过unix中的fork()生成子进程时,子进程将继承父级的所有打开文件描述符。 子进程负责关闭不需要的描述符。

您的代码两次调用fork,一次通过os.system()间接调用,然后再次直接在C代码中调用。 因此,您有两种处理方式:

第一种是关闭在C代码的子进程中不需要的所有未使用的文件描述符。 通常,这是一个好习惯,如果您不这样做,那么如果您生了许多孩子并且他们都获得了其父母fds的副本,那么在系统中用尽文件描述符的情况并不罕见。

#include <unistd.h>
#def MAXFD 256

void close_fds() {
  int i;
  for (i = 3; i < MAXFD; i++) {
    close(i);
  }
}

另一个选择是在Python进行的fork调用中关闭文件描述符。 你是不是能够做到这一点,如果你调用os.system()但是如果你做与几乎等同的调用你有这个选项subprocess模块:

from subprocess import Popen

Popen("/home/path/test/child", close_fds=True).wait()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM