J'utilisais this answer pour exécuter des commandes parallèles avec multiprocessing en Python sur une machine Linux.multiprocessing renvoie "trop de fichiers ouverts" mais en utilisant "with ... as" le corrige. Pourquoi?
Mon code a fait quelque chose comme:
import multiprocessing
import logging
def cycle(offset):
# Do stuff
def run():
for nprocess in process_per_cycle:
logger.info("Start cycle with %d processes", nprocess)
offsets = list(range(nprocess))
pool = multiprocessing.Pool(nprocess)
pool.map(cycle, offsets)
Mais je recevais cette erreur: OSError: [Errno 24] Too many open files
Ainsi, le code a été d'ouvrir trop de descripteur de fichier, à savoir: il commençait trop de processus et ne pas les mettre fin à .
Je l'ai fixé en remplaçant les deux dernières lignes avec ces lignes:
with multiprocessing.Pool(nprocess) as pool:
pool.map(cycle, offsets)
Mais je ne sais pas exactement pourquoi ces lignes fixes elle.
Que se passe-t-il en dessous de with
?
Voici le [code source] (https://github.com/python/cpython/blob/master/Lib/multiprocessing/pool.py#L607-L611) chaque processus appelle 'self.terminate()' – salparadise
La version 'with' appelle implicitement' pool.close() 'après que' pool.map() 'soit revenu. Selon les docs, cela "Empêche d'autres tâches d'être soumises au pool.Une fois toutes les tâches terminées, les processus de travail vont sortir". Cela provoque probablement la fermeture des fichiers ouverts à chaque tâche. – martineau
Ai-je tort, ou @COLDSPEED a répondu à la question et maintenant il est effacé? Je n'ai pas été capable de le lire en profondeur, mais j'aimerais ... Mais maintenant c'est parti ... Quelqu'un sait pourquoi la question a été rejetée? – nephewtom