资讯专栏INFORMATION COLUMN

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

dunizb / 1903人阅读

摘要:上一篇文章线程专题使用锁的注意事项下一篇文章线程专题多线程按顺序执行线程没有任何方法可用于强制终止或挂起。实用工具函数函数名解释返回当前活动的对象数量。

上一篇文章: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异常。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42416.html

相关文章

  • Python线程专题纵览篇

    摘要:上一篇文章进程专题完结篇多进程处理的一般建议下一篇文章线程专题多线程使用的必要性进程线程进程能够完成多任务,比如在一个电脑上可以运行多个软件。由于占用资源少,也使得多线程程序并发比较高。 上一篇文章:Python进程专题完结篇:多进程处理的一般建议下一篇文章:Python线程专题1:多线程使用的必要性 进程VS线程 进程:能够完成多任务,比如在一个电脑上可以运行多个软件。线程:也能够...

    张红新 评论0 收藏0
  • Python线程专题10:queue、多线程按顺序执行

    摘要:实例使用队列一般可以简化多线程的程序。实际开发中,此处应该使用有用的工作代替完成,指示收到和返回哨兵好帅运行结果好帅多线程按顺序执行直接看实例吧,控制多线程的执行顺序代码控制多线程的执行顺序创建实例,第一个开始不上锁结果 上一篇文章:Python线程专题9:线程终止与挂起、实用工具函数下一篇文章:敬请期待 queue模块实现了各种【多生产者-多消费者】队列。可用于在执行的多个线程之间安...

    scq000 评论0 收藏0
  • Python线程专题8:使用锁的注意事项

    摘要:上一篇文章线程专题条件变量下一篇文章线程专题线程终止与挂起使用诸如之类的锁原语时,必须多加小心,锁的错误使用很容易导致死锁或相互竞争。依赖锁的代码应该保证当出现异常时可以正常的释放锁。 上一篇文章:Python线程专题7:条件变量下一篇文章:Python线程专题9:线程终止与挂起 使用诸如Lock、RLock、Semphore之类的锁原语时,必须多加小心,锁的错误使用很容易导致死锁或...

    phoenixsky 评论0 收藏0
  • Python线程专题3:thread对象

    摘要:上一篇文章线程专题多线程共享全局变量下一篇文章线程专题对象对象对象对象类用于表示单独的控制线程。线程启动时将调用此方法。阻塞线程,等待直到线程终止或者出现超时为止。当不存在任何任何活动的非后台进程时,整个程序会退出。 上一篇文章:Python线程专题2:多线程共享全局变量下一篇文章:Python线程专题4:Timer对象、Lock对象、Rlock对象 Thread对象 Thread类...

    EdwardUp 评论0 收藏0
  • JS专题之事件循环

    摘要:宏任务需要多次事件循环才能执行完。总结事件循环是和事件调用机制的核心,保证了页面可以有序无阻塞的进行。事件循环的主要逻辑是先执行调用栈,直到清空调用栈只剩下全局上下文。微任务执行后完,进行页面渲染和垃圾回收后进行下一轮事件循环。 准备知识 1. 进程(process) 进程是系统资源分配一个独立单位,一个程序至少有一个进程。比方说:一个工厂代表一个 CPU, 一个车间就是一个进程,任一...

    mengera88 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<