在队列中启动多个线程时,哪个线程首先从堆栈中获取

时间:2015-08-21 21:29:25

标签: python multithreading

python示例给出了如何等待排队任务完成的示例,但我不确定如何确定检索顺序。这是代码:

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done

正如我所解释的那样,这个代码在range个线程开始的任何地方开始,但是在队列的items中放置了许多source

因此,如果您启动20个线程,并在队列中放入30个项目,则看起来您将有20个工作线程全部调用

while True:
    item = q.get()
    do_work(item)

因此,第一次将一个项目放入队列时,20个线程中的哪一个实际上将该项目放入队列中?

1 个答案:

答案 0 :(得分:1)

一般来说,不会有保证订单,只保证相互排斥。假设您正在使用queue.Queue(Python 3)之类的东西,它使用同步原语来确保一次只有一个线程可以get()一个项目。但是线程获得机会的顺序将受到OS调度程序变幻莫测的影响 - 负载,优先级等。