我在和concurrent.futures玩。
目前我的未来打电话给time.sleep(secs)。
看来Future.cancel()做的事情比我想象的要少。
如果未来已经在执行,那么time.sleep()就不会被它取消。
等()的超时值参数也是一样的。它不会取消我的time.sleep()。
如何取消在time.sleep()中执行的concurrent.futures?
为了进行测试,我使用了ThreadPoolExecutor。
发布于 2016-07-25 07:59:52
如果向ThreadPoolExecutor提交函数,执行器将在线程中运行该函数,并将其返回值存储在Future对象中。由于并发线程的数量是有限的,所以您可以选择取消对未来的挂起的执行,但是一旦将工作线程中的控件传递给可调用程序,就无法停止执行。
请考虑以下代码:
import concurrent.futures as f
import time
T = f.ThreadPoolExecutor(1) # Run at most one function concurrently
def block5():
time.sleep(5)
return 1
q = T.submit(block5)
m = T.submit(block5)
print q.cancel() # Will fail, because q is already running
print m.cancel() # Will work, because q is blocking the only thread, so m is still queued一般来说,每当你想要有可取消的东西时,你自己就有责任确保它是可取消的。
不过,也有一些现成的选择。例如,考虑使用异步,他们也使用有一个使用睡眠的例子。这个概念绕过了这个问题,无论何时调用任何可能的阻塞操作,相反,将控制返回到运行在最外层上下文中的控制循环,同时注意到,在结果可用时应该继续执行--或者,在您的情况下,在n秒过去之后继续执行。
发布于 2016-07-28 06:34:56
我对concurrent.futures不太了解,但是您可以使用这个逻辑来打破时间。使用循环代替sleep.time()或wait()
for i in range(sec):
sleep(1)中断或中断可以用来脱离循环。
发布于 2022-04-21 04:03:15
我想通了。
下面是一个例子:
from concurrent.futures import ThreadPoolExecutor
import queue
import time
class Runner:
def __init__(self):
self.q = queue.Queue()
self.exec = ThreadPoolExecutor(max_workers=2)
def task(self):
while True:
try:
self.q.get(block=True, timeout=1)
break
except queue.Empty:
pass
print('running')
def run(self):
self.exec.submit(self.task)
def stop(self):
self.q.put(None)
self.exec.shutdown(wait=False,cancel_futures=True)
r = Runner()
r.run()
time.sleep(5)
r.stop()https://stackoverflow.com/questions/38461603
复制相似问题