簡體   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