由孩子继承的Python RabbitMQ连接
问题描述:
问题如下。 调用一个执行两件事情的Python程序:连接到rabbitmq服务器并调用产生两个进程的c程序。由孩子继承的Python RabbitMQ连接
当python程序结束时,连接仍然建立在负责孩子。
因此,当父母死亡时,孩子会继承其父资源。
做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()
一个子进程的子进程继承了所有家长的打开文件描述符。子进程负责关闭它不需要的描述符。
您的代码通过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()
此。 Popen工作。 – Illiax