我有 2 个关于 python 中的线程和队列的问题。
max_size
arg 在queue.Queue()
中做什么?- 根据线程(
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))
在队列上设置最大大小,以便为辅助角色提供限制机制。假设您有 X 生产者和 Y 使用者使用相同的队列,如果任何使用者抛出Queue.Full
异常,您可以将其用作减慢生产速度的信号。
在您的情况下,由于工作实际上并没有做任何计算成本高昂的事情(只是附加到列表中,我可能会以不安全的方式添加),并且您只有 1 个生产者和 10 个消费者,因此队列很可能总是空的,而不是消费者处于空闲状态(如果 get 方法附加了超时,则会引发Queue.Empty
异常。
作为旁注,为了确定哪些使用者和生产者处于空闲状态,您应该对队列的put
和get
方法使用 timeout
参数