il codice di prova è molto semplice:Come funziona coda in python
import threading, Queue
import time, random
class Worker(threading.Thread):
def __init__(self, index, queue):
threading.Thread.__init__(self)
self.index = index
self.queue = queue
def run(self):
while 1:
time.sleep(random.random())
item = self.queue.get()
if item is None:
break
print "index:", self.index, "task", item, "finished"
self.queue.task_done()
queue = Queue.Queue(0)
for i in range(2):
Worker(i, queue).start()
for i in range(10):
queue.put(i)
for i in range(2):
queue.put(None)
print "Main OK"
e il risultato è un po 'ogni volta diverso l'eseguo, qui è solo una:
Main OK
index: 1 task 0 finished
index: 0 task 1 finished
index: 0 task 2 finished
index: 1 task 3 finished
index: 1 task 4 finished
index: 0 task 5 finished
index: 1 task 6 finished
index: 0 task 7 finished
index: 1 task 8 finished
index: 1 task 9 finished
IMO quando il thread principale è terminato, verrà stampato "Main OK", quindi il primo thread verrà eseguito fino a quando non sarà disponibile in time.sleep(random.random())
, quindi il primo thread verrà interrotto e il secondo thread continuerà. uguale al primo thread, il secondo thread si addormenta quando viene eseguito in time.sleep(random.random())
, quindi il primo thread continuerà di nuovo. e stamperà index:0 task 0 finished
subito dopo Main OK
, ma in realtà ciò che segue Main OK
è index: 1...
non index: 0...
! perché? e sembra che la coda non funzioni come un multi-thread normale, a volte lo stesso thread di indice viene eseguito tre volte o più continuamente! In che mondo funziona il meccanismo Queue? ogni aiuto è apprezzato!
Si prega di non fare multi-threading se non capisco. –