我有两个关于python中线程和队列的问题。
max_size
中queue.Queue()
arg做了什么?num_worker_threads
)?我找不到任何改进。 import time
import queue
import threading
num_worker_threads = 10
store = []
def worker():
while True:
item = q.get()
if item is None:
break
store.append(item)
q.task_done()
start = time.time()
q = queue.Queue() # what does max_size do in queue?
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
for item in range(1000000):
q.put(item)
# block until all tasks are done
q.join()
# stop workers
for i in range(num_worker_threads):
q.put(None)
for t in threads:
t.join()
end = time.time()
print('running time: {}'.format(end - start))
答案 0 :(得分:0)
您可以在队列中设置最大大小,以便为您的工作人员提供限制机制。假设您有X生产者和Y消费者使用相同的队列,如果任何消费者抛出Queue.Full
异常,您可以将此作为信号来减慢生产速度。
在你的情况下,因为工作实际上没有做任何计算上昂贵的事情(只是附加到列表,我可能会添加一个不安全的方式),而你只有1个生产者和10个消费者,队列很可能永远是空的,而消费者是空闲的(如果get方法附加了超时,则会抛出Queue.Empty
异常。
作为旁注,为了弄清楚哪些消费者和生产者都处于空闲状态,您应该对队列的timeout
和put
方法使用get
参数