eva*_*ria 6 python multithreading
我需要暂停和恢复线程,它会不断执行某些任务.start()调用时开始执行,不应该中断,必须从pause()调用时继续执行.
我怎样才能做到这一点?
请记住,除了IO阻塞操作的情况之外,在Pythin中使用线程不会授予您并行处理.有关更多信息,看看这个和这个
你不能在Python中任意暂停一个线程(在进一步阅读之前请记住这一点).我不确定你是否有办法在操作系统级别(例如使用pure-C).您可以做的是允许线程在您事先考虑的特定点暂停.我会举个例子:
class MyThread(threading.Thread):
def __init__(self, *args, **kwargs):
super(MyThread, self).__init__(*args, **kwargs)
self._event = threading.Event()
def run(self):
while True:
self.foo() # please, implement this.
self._event.wait()
self.bar() # please, implement this.
self._event.wait()
self.baz() # please, implement this.
self._event.wait()
def pause(self):
self._event.clear()
def resume(self):
self._event.set()
Run Code Online (Sandbox Code Playgroud)
这种方法可行,但:
self._event.wait()).编辑我没有测试这个,但如果你需要多个这样的线程,这可能没有那么多的子类化:
class MyPausableThread(threading.Thread):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
self._event = threading.Event()
if target:
args = (self,) + args
super(MyPausableThread, self).__init__(group, target, name, args, kwargs)
def pause(self):
self._event.clear()
def resume(self):
self._event.set()
def _wait_if_paused(self):
self._event.wait()
Run Code Online (Sandbox Code Playgroud)
这应该允许你通过调用创建一个没有更多子类的自定义线程MyPausableThread(target=myfunc).start(),并且你的callable的第一个参数将接收线程对象,self._wait_if_paused()当你需要暂停检查时可以从中调用.
或者甚至更好,如果你想隔离目标访问线程对象:
class MyPausableThread(threading.Thread):
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
self._event = threading.Event()
if target:
args = ((lambda: self._event.wait()),) + args
super(MyPausableThread, self).__init__(group, target, name, args, kwargs)
def pause(self):
self._event.clear()
def resume(self):
self._event.set()
Run Code Online (Sandbox Code Playgroud)
并且你的目标callable将在第一个参数中接收一个可以这样调用的函数:( pause_checker()前提是目标callable中的第一个param被命名pause_checker).
| 归档时间: |
|
| 查看次数: |
2895 次 |
| 最近记录: |