在python中暂停和恢复线程

eva*_*ria 6 python multithreading

我需要暂停和恢复线程,它会不断执行某些任务.start()调用时开始执行,不应该中断,必须从pause()调用时继续执行.

我怎样才能做到这一点?

Lui*_*lli 7

请记住,除了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)

这种方法可行,但:

  • 根据我给你的链接,线程通常是一个坏主意.
  • 您必须使用此方法自行编写run方法.这是因为你需要控制你要检查暂停的确切点,这意味着访问Thread对象(也许你想创建一个额外的方法而不是调用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).