如何解决如何无限期地暂停线程,直到用户手动恢复线程
比方说,我有一个名为 Worker 的类,它具有许多方法,并且其中某些方法具有for
和while
循环。遵循以下原则:
class Worker:
def operation1(self):
for i in range(5000):
# performs some resource intensive operation 5000 times.
def operation2(self):
while some_condition:
# another resource intensive operation in the while loop
我希望能够在任何给定时间暂停该类实例的执行,然后再恢复它。因此,此类应在一个线程上运行,而GUI应在另一个线程上运行。 GUI将具有两个按钮:暂停和恢复,它们将暂停并相应地恢复执行。如何实现?我知道如何暂停执行线程的唯一方法是使用sleep()
方法,但是如何暂停直到用户恢复执行呢?
解决方法
在未使用的线程上使用睡眠没有任何问题。如果您有需要经常检查的状况,那么最好使用短暂的睡眠,否则,如果您需要捕获一个信号来停止程序,则可能需要等到睡眠结束才能评估状况。
from datetime import datetime
import threading
from time import sleep
def pp(val):
print(f'{datetime.now().isoformat()}: {val}')
class Worker:
running: bool
some_condition: bool
op1_count: int
op2_count: int
def __init__(self):
self.op1_count = 0
self.op2_count = 0
self.running = True
# start with the condition off,idling
self.some_condition = False
# it's a good idea to hold onto your threads,you can use a Pool if you like
self.threads = [
threading.Thread(target=i) for i in [self.operation1,self.operation2]
]
for t in self.threads:
t.start()
def stop(self):
self.running = False
for t in self.threads:
t.join()
def toggle(self):
self.some_condition = not self.some_condition
def operation1(self):
for i in range(5000):
# performs some resource intensive operation 5000 times.
if not self.running:
break
sleep(1)
if self.some_condition:
# do the work
self.op1_count = self.op1_count + 1
def operation2(self):
while self.running:
sleep(1)
if self.some_condition:
# do the work
self.op2_count = self.op2_count + 1
# another resource intensive operation in the while loop
def status(self,op: int):
if op == 1:
return self.op1_count
if op == 2:
return self.op2_count
raise ValueError(f'unknown operation: {op}')
在您的示例中,我让线程在Class __init__
函数中启动,但是您可以从任意位置启动线程。我发现最好在周围的类中对其进行引用,然后在join()
方法的每个线程上调用stop
。主要是我将线程管理放在类中,以便可以在解释器中说明从另一个线程管理工作程序的方式如何与之交互,而不必在那里输入太多内容。
Python 3.7.2 (default,Feb 15 2019,12:09:55)
[GCC 5.4.0 20160609] on linux
Type "help","copyright","credits" or "license" for more information.
>>> from ex import Worker,pp
>>> w = Worker()
>>> pp(w.status(1))
2020-08-27T17:55:15.017247: 0
>>> pp(w.status(2))
2020-08-27T17:55:16.947884: 0
>>> w.toggle()
>>> pp(w.status(1))
2020-08-27T17:55:21.547302: 2
>>> pp(w.status(2))
2020-08-27T17:55:23.174757: 4
>>> w.toggle()
>>> pp(w.status(1))
2020-08-27T17:55:30.048969: 8
>>> pp(w.status(2))
2020-08-27T17:55:31.746552: 8
>>> w.stop()
>>>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。