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