我是python多线程的新手,并试图理解加入多个工作线程之间的基本区别,并在我完成处理后调用abort。有人可以用一个例子来解释我吗?
答案 0 :(得分:1)
.join()和设置中止标志是干净地关闭线程的两个不同步骤。
join()只是等待一个将要终止的线程完成。因此:
import threading
import time
def thread_main():
time.sleep(10)
t = threading.Thread(target=thread_main)
t.start()
t.join()
这是一个合理的计划。连接只是等待线程完成。它没有做任何事情来实现,但线程无论如何都会终止,因为它只是10秒的睡眠。
相比之下
import threading
import time
def thread_main():
while True:
time.sleep(10)
t = threading.Thread(target=thread_main)
t.start()
t.join()
不是一个好主意,因为join仍然会等待线程自行终止。但线程永远不会这样做,因为它永远循环。因此整个程序无法终止。
这就是你想要某种信号传递给线程的点,所以要自行停止
import threading
import time
stop_thread = False
def thread_main():
while not stop_thread:
time.sleep(10)
t = threading.Thread(target=thread_main)
t.start()
stop_thread = True
t.join()
这里stop_thread扮演你的__abort标志的角色,并在完成最新工作(在这种情况下为sleep(10))后发出线程停止信号
因此,该程序再次合理,并在被要求时终止。
当线程使用消费者模式(即从队列中获取其工作)时,另一种通知线程停止的流行方式是发布一个特殊的“立即终止”工作项作为设置标志变量的替代方法:
def thread_main():
while True:
(quit, data) = work_queue().get()
if quit: break
do_work(data)