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循环
答案 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