Python线程专题9:线程终止与挂起、实用工具函数

上一篇文章: Python线程专题8:使用锁的注意事项
下一篇文章: Python线程专题10:queue、多线程按顺序执行

线程没有任何方法可用于强制终止或挂起。这是设计上的缘由,由于编写线程程序自己十分复杂。例如:若是某个线程已经获取了锁,在它可以释放锁以前强制终止或挂起它,将致使整个应用程序出现死锁。此外,终止时通常不能简单的【释放全部的锁】,由于复杂的线程同步常常涉及锁定和清楚锁定操做,而这些操做在执行时的次序要十分精确。segmentfault

若是要为终止或挂起提供服务,须要本身构建这些功能。通常的作法是在循环中运行线程,这个循环的做用是按期检查线程的状态以决定它是否应该终止。例如:
from threading import  Thread,Lock
class StoppableThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self._terminate=False
        self._suspend_lock=Lock()

    def terminate(self):
        self._terminate=True

    def suspend(self):
        self._suspend_lock.acquire()

    def resume(self):
        self._suspend_lock.release()

    def run(self):
        while True:
            if self._terminate:
                break
            self._suspend_lock.acquire()
            self._suspend_lock.release()
            ...

要记住,要让这种方法可靠的工做,线程应该千万当心不要执行任何类型的阻塞I/O操做。例如,若是线程阻塞等待数据到达,那么它会直到该操做被唤醒时才会终止。所以,你须要在实际中使用超时、非阻塞I/O和其它高级功能,从而确保终止检查执行的频率足够。多线程

实用工具函数

函数名 解释
active_count() 返回当前活动的Thread对象数量。
current_thread() 返回该函数调用者所在的线程的Thread对象。
enumerate() 列出当前全部活动的Thread对象
local() 返回local对象,用于保存线程本地的数据。应该保证此对象在每一个线程中是惟一的。
setprofile(func) 设置一个配置文件函数,用于已建立的全部线程。func在每一个线程开始运行以前被传递给sys.setprofile()函数。
settrace(func) 设置一个跟踪函数,用于已建立的全部线程。func在每一个线程开始运行以前被传递给sys.settrace()函数。
stack_size(size) 返回建立新线程时使用的栈大小。可选的整数参数size表示建立新线程时使用的栈大小。size的值能够是32768(32kb)或更大,并且是4096(4kb)的倍数,这样可移植性更好。若是系统上不支持此操做,将引起ThreadError异常。
相关文章
相关标签/搜索