由孩子继承的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() 
+0

此。 Popen工作。 – Illiax