【发布时间】:2021-09-20 16:47:10
【问题描述】:
我正在尝试学习一些关于 python 中的线程的知识。我知道我可以使用各种其他池和进程或管道,这可能更容易,但我对使用线程模块感兴趣。
from threading import Thread
from queue import Queue
class SimulationThread(Thread):
def __init__(self, input_queue: Queue, results_queue: Queue):
Thread.__init__(self)
self.input_queue = input_queue
self.results_queue = results_queue
def run(self) -> None:
try:
data = self.input_queue.get() # will be replaced with simulation data
self.results_queue.put(data)
finally:
return self.input_queue.task_done()
N = 10 # number of simulations to run
NP = 8 # number of threads to use
input_queue = Queue()
results_queue = Queue()
for x in range(NP):
worker = SimulationThread(input_queue, results_queue)
worker.daemon = True
worker.start()
for i in range(N):
input_queue.put(i)
现在我尝试了几种不同的方法来收集结果:
# always returns 0
print(results_queue.get())
#hangs
results_queue.join()
# does nothing, I'm quessing queue is not yet populated
while not results_queue.empty():
print(results_queue.get())
# prints nothing
ret = results_queue.get()
while ret is None:
ret = results_queue.get()
print(ret)
# finally prints out the results, but in order of 1 - 7. No 8 or 9.
ret = results_queue.get()
while ret is not None:
ret = results_queue.get()
print(ret)
if results_queue.empty():
ret = None
这时我停下来寻求帮助。如何让所有 NP 线程同时处理所有 N 个数字?
【问题讨论】:
标签: python multithreading queue