[英]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.