Ho una domanda comprendere la coda nel modulo multiprocessing
in Python 3coda Python 3 Multiprocessing situazione di stallo quando si chiama unirsi prima che la coda è vuota
Questo è quello che dicono nel programming guidelines:
Orso tenere presente che un processo che ha inserito gli elementi in una coda attende prima che termini fino a quando tutti gli elementi memorizzati nel buffer non vengono alimentati dal feeder ” feed nella pipe sottostante. (Il processo figlio può chiamare il metodo di Queue.cancel_join_thread della coda per evitare questo comportamento.)
Questo significa che ogni volta che si utilizza una coda è necessario fare in modo che tutti gli elementi che sono stati messi in coda sarà eventualmente rimosso prima che il processo venga unito. Altrimenti non si può essere certi che i processi che hanno gli elementi messi in coda terminino. Ricorda inoltre che i processi non demoniaci di verranno uniti automaticamente.
Un esempio che deadlock è la seguente:
from multiprocessing import Process, Queue def f(q): q.put('X' * 1000000) if __name__ == '__main__': queue = Queue() p = Process(target=f, args=(queue,)) p.start() p.join() # this deadlocks obj = queue.get()Una soluzione sarebbe di scambiare le ultime due righe (o semplicemente rimuovere la linea p.join()).
Quindi apparentemente, queue.get()
non deve essere chiamato dopo un join()
.
Tuttavia ci sono esempi di utilizzo code in cui get
è chiamato dopo un join
come:
import multiprocessing as mp
import random
import string
# define a example function
def rand_string(length, output):
""" Generates a random string of numbers, lower- and uppercase chars. """
rand_str = ''.join(random.choice(
string.ascii_lowercase
+ string.ascii_uppercase
+ string.digits)
for i in range(length))
output.put(rand_str)
if __name__ == "__main__":
# Define an output queue
output = mp.Queue()
# Setup a list of processes that we want to run
processes = [mp.Process(target=rand_string, args=(5, output))
for x in range(2)]
# Run processes
for p in processes:
p.start()
# Exit the completed processes
for p in processes:
p.join()
# Get process results from the output queue
results = [output.get() for p in processes]
print(results)
ho eseguire questo programma e funziona (pubblicato anche come una soluzione per la questione StackOverflow Python 3 - Multiprocessing - Queue.get() does not respond).
Qualcuno potrebbe aiutarmi a capire qual è la regola per la situazione di stallo?