上一篇文章:
Python线程专题8:使用锁的注意事项下一篇文章:
Python线程专题10:queue、多线程按顺序执行
线程没有任何方法可用于强制终止或挂起。这是设计上的原因,因为编写线程程序本身十分复杂。例如:如果某个线程已经获取了锁,在它能够释放锁之前强制终止或挂起它,将导致整个应用程序出现死锁。此外,终止时一般不能简单的【释放所有的锁】,因为复杂的线程同步经常涉及锁定和清楚锁定操作,而这些操作在执行时的次序要十分精确。
如果要为终止或挂起提供服务,需要自己构建这些功能。一般的做法是在循环中运行线程,这个循环的作用是定期检查线程的状态以决定它是否应该终止。例如:
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异常。 |