我创建了一个运行脚本的线程,它可能会花费很多时间。我想暂停并在另一个线程中恢复它。如果我使用标志并检测它,它不能立即暂停。我搜索了很多,但似乎自我.__标志,自我。暂停无法实现目标。
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()
答案 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层,因此很慢。)