Le problème est le suivant. Appelez un programme python qui fait deux choses: se connecter à un serveur rabbitmq et appelle un programme c qui engendre deux processus.Connexion Python RabbitMQ héritée par un enfant
Lorsque le programme python se termine, la connexion est toujours établie en charge d'un enfant. Par conséquent, un enfant hérite de sa ressource parent lorsque le parent meurt.
faire un netstat -putan | grep rabbitmqip
tcp 0 0 localhost:39744 rabbitmqip:5672 ESTABLISHED 25693/child
C'est ce que je reçois quand le script python terminé.
J'imagine que la connexion serait perdue dans un cas comme celui-ci.
Cela semble se produire avec des connexions à un serveur RabbitMQ, nous ne pouvons pas reproduire avec des connexions TCP régulières.
Quelqu'un a-t-il déjà eu ce problème? existe-t-il une solution de contournement?
Le code python serait mon consommateur de lapin et le programme c serait des scripts en arrière-plan qui sont engendrés ou tués en fonction du travail du travailleur. Je ne peux pas avoir la connexion établie quand je tue le consommateur, indépendamment des spawns étant actifs ou pas parce qu'alors les enfants recevraient des messages qu'ils ne comprennent pas de la file d'attente.
Code comme exemple:
Python:
connection = pika.BlockingConnection(pika.ConnectionParameters(host='RabbitServer'))
print ("Starting Child...")
system("/home/path/test/child")
print ("Done")
programme des enfants.
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);
}
Ce. Popen a travaillé. – Illiax