python多线程中thread.join和thread.abort之间的区别

时间:2015-06-17 03:10:15

标签: python multithreading

我是python多线程的新手,并试图理解加入多个工作线程之间的基本区别,并在我完成处理后调用abort。有人可以用一个例子来解释我吗?

1 个答案:

答案 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)