如何在python中暂停和恢复一个线程

时间:2018-02-14 02:14:13

标签: python multithreading pause

我创建了一个运行脚本的线程,它可能会花费很多时间。我想暂停并在另一个线程中恢复它。如果我使用标志并检测它,它不能立即暂停。我搜索了很多,但似乎自我.__标志,自我。暂停无法实现目标。

class MT(threading.Thread):

    def __init__():
        self.__running = threading.Event()
        self.__running.set()
        self.__flag = threading.Event()
        self.__flag.set()

    def run(self):
        '''
        run the script
        '''
        while self.__running.isSet():
             self.__flag.wait()
             moudleTest()

    def pause(self):
        '''
        pause the thread
        '''
        self.__flag.clear()

    def resume(self):
        '''
        resume the thread
        '''
        self._-flag.set()

1 个答案:

答案 0 :(得分:1)

如果不使用具有特定于操作系统的技术的C扩展在Python层下潜水,那么你想要的是不可能的,例如:在Windows上,SuspendThread。你不能通过Python级API立即完全挂起另一个线程,因为这样做被认为是非常危险的。

即使这样的事情是可能的,这也是一个可怕的想法,容易出现死锁和其他可怕的事情。例如,在CPython 3.3之前,整个解释器都有一个全局导入锁。如果另一个线程在暂停时import模块的中间位置,那么 no 其他线程可以完全导入,直到它被恢复并完成导入(如果那样导致死锁) thread是负责恢复被挂起的线程的人;);在CPython 3.3+中,它更好,但如果另一个线程试图导入该特定模块,它就会严重死锁。

总结:恰当地使用Lock s,Event和/或Condition,如果您需要更快的暂停,请更频繁地进行wait检查(穿插)与线程"工作"更经常)。如果您的代码在暂停之前不能容忍甚至很小的延迟,那么您就有一个需要修复的设计问题(例如,您使用Event来模拟锁定等,可能是为了提高性能由于Event建立在Condition上,而Lock s依次建立在Lock上,而.class以外的所有.java都是在Python层实现的,所以这是非常误导的,不是C层,因此很慢。)