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()