为什么我们使用while 1:在python中传递线程

时间:2014-05-26 08:27:23

标签: python

from thread import start_new_thread

num_threads = 0
def heron(a):
    global num_threads
    num_threads += 1

    # code has been left out, see above
    num_threads -= 1
    return new

start_new_thread(heron,(99,))
start_new_thread(heron,(999,))
start_new_thread(heron,(1733,))
start_new_thread(heron,(17334,))

while num_threads > 0:
    pass

这是我想在最后一行知道的简单线程代码为什么我们使用while循环

3 个答案:

答案 0 :(得分:2)

最终的while循环在主线程退出之前等待所有线程完成。

这是昂贵的检查(旋转等待的100%CPU)。您可以通过以下两种方式之一来改进它:

 while num_threads > 0:
     time.sleep(0.1)

或跟踪列表中的所有主题并逐个加入:

for worker in worker_threads:
    worker.join()

答案 1 :(得分:0)

我们希望在所有孩子完成工作之前让过程保持活力。因此,只要任何孩子还活着,我们就必须继续在主线程中执行某些操作,因此检查num_threads变量。

如果不是这样的话,所有的子线程都会被杀死ASAP主线程完成它的工作,无论它们是否真的完成了它们的工作,所以等待它们是必须的,以确保一切都完成。

答案 2 :(得分:0)

以Raymond Hettinger的答案为基础:父进程启动了许多线程,每个线程都有效。然后我们等待每个退出,以便我们可以收集和处理他们的输出。在这种情况下,每个工作人员只输出到屏幕,因此父母只需要加入()每个任务以确保它正确运行和退出。

这是对上述代码进行编码的另一种方法。它使用更高级别的库threading(vs thread),并且仅在当前线程之外的线程上调用join()。我们还使用threading.enumerate()而不是手动跟踪工作线程 - 更容易。

代码:

import threading

def heron(a):
    print '{}: a={}'.format(threading.current_thread(), a)

threading.Thread(target=heron, args=(99,)).start()
threading.Thread(target=heron, args=(999,)).start()
threading.Thread(target=heron, args=(1733,)).start()
threading.Thread(target=heron, args=(17334,)).start()

print
print '{} threads, joining'.format(threading.active_count())
for thread in threading.enumerate():
    print '- {} join'.format(thread)
    if thread == threading.current_thread():
        continue
    thread.join()
print 'done'

示例输出:

python ./jointhread.py 
<Thread(Thread-1, started 140381408802560)>: a=99
<Thread(Thread-2, started 140381400082176)>: a=999
<Thread(Thread-3, started 140381400082176)>: a=1733

2 threads, joining
- <_MainThread(MainThread, started 140381429581632)> join
- <Thread(Thread-4, started 140381408802560)> join
<Thread(Thread-4, started 140381408802560)>: a=17334
done