C'est normal que tu épuises les fds disponibles car tu ne fermes pas ce qui est ouvet (en fait, tu attends que le GC le fasse, ce qui pourrait expliquer le pourquoi "avec un sleep ça marche").
Typiquement, tu ouvres le fichier FIFO à l'extérieure de la boucle. Encore mieux, tu peux l'ouvrir avant de lancer ton subprocess (qui, in fine, n'est rien d'autre qu'un fork et donc hérité les FDs ouverts sauf si close_on_exec). Et puis, toujours mieux, au lieu d'utiliser un fichier fifo, tu peux utiliser un pipe anonyme. Mais... mais... Attendez ? Ne serait-ce pas ce que que stdin=subprocess.PIPE fait ? Mais oui :-) En fait, tu n'as qu'à faire des read/write sur ce stdin (en mode bloquant, de préférence), et tu l'as déjà ton IPC. :-)
Utiliser des sockets est une autre option qui permet notamment de faire un select(), i.e. de multiplexer avec d'autres connections réseaux.
[^] # Re: Chaussette
Posté par benja . En réponse au message Communication inter-processus. Évalué à 3.
C'est normal que tu épuises les fds disponibles car tu ne fermes pas ce qui est ouvet (en fait, tu attends que le GC le fasse, ce qui pourrait expliquer le pourquoi "avec un sleep ça marche").
Typiquement, tu ouvres le fichier FIFO à l'extérieure de la boucle. Encore mieux, tu peux l'ouvrir avant de lancer ton subprocess (qui, in fine, n'est rien d'autre qu'un fork et donc hérité les FDs ouverts sauf si close_on_exec). Et puis, toujours mieux, au lieu d'utiliser un fichier fifo, tu peux utiliser un pipe anonyme. Mais... mais... Attendez ? Ne serait-ce pas ce que que
stdin=subprocess.PIPEfait ? Mais oui :-) En fait, tu n'as qu'à faire des read/write sur ce stdin (en mode bloquant, de préférence), et tu l'as déjà ton IPC. :-)Utiliser des sockets est une autre option qui permet notamment de faire un select(), i.e. de multiplexer avec d'autres connections réseaux.