threading set_start_method multiple ejemplos python python-2.7 multiprocessing python-multiprocessing

set_start_method - python pool process



La secuencia de comandos que usa el módulo de multiprocesamiento no finaliza (1)

Esto se debe a que cuando put muchos elementos en un multiprocessing.Queue . multiprocessing.Queue , finalmente se almacenan en la memoria, una vez que el Pipe subyacente está lleno. El búfer no se sonrojará hasta que algo comience a leer desde el otro extremo de la Queue , lo que permitirá que la Pipe acepte más datos. Un Process no puede finalizar hasta que el búfer para todas sus instancias de Queue se haya enjuagado por completo a su Pipe subyacente. La implicación de esto es que si intenta join un proceso sin tener otro proceso / llamada de subproceso en su Queue , puede interbloqueo. Esto se menciona en los documentos :

Advertencia

Como se mencionó anteriormente, si un proceso hijo ha puesto elementos en una cola (y no ha utilizado JoinableQueue.cancel_join_thread ), entonces ese proceso no terminará hasta que todos los elementos almacenados en búfer hayan sido descargados a la tubería.

Esto significa que si intenta unirse a ese proceso, puede obtener un punto muerto a menos que esté seguro de que todos los elementos que se han puesto en la cola se han consumido. De forma similar, si el proceso secundario no es daemonic, el proceso principal puede bloquearse al salir cuando intenta unir a todos sus elementos secundarios no daemonicos.

Tenga en cuenta que una cola creada con un administrador no tiene este problema.

Puede solucionar el problema al no llamar a join hasta después de vaciar la Queue en el elemento primario:

for _ in xrange(len(langs)): item = que.get() print(item) dicList.append(item) # join after emptying the queue. for p in processList: p.join() print("here")

El siguiente código, no imprime "here" . ¿Cuál es el problema? Lo probé en mis máquinas (Windows 7, Ubuntu 12.10) y http://www.compileonline.com/execute_python_online.php. No imprime "here" en todos los casos.

from multiprocessing import Queue, Process def runLang(que): print "start" myDict=dict() for i in xrange(10000): myDict[i]=i que.put(myDict) print "finish" def run(fileToAnalyze): que=Queue() processList=[] dicList=[] langs= ["chi","eng"] for lang in langs: p=Process(target=runLang,args=(que,)) processList.append(p) p.start() for p1 in processList: p1.join() print "here" for _ in xrange(len(langs)): item=que.get() print item dicList.append(item) if __name__=="__main__": processList = [] for fileToAnalyse in ["abc.txt","def.txt"]: p=Process(target=run,args=(fileToAnalyse,)) processList.append(p) p.start() for p1 in processList: p1.join()