首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python concurrent.futures中拆分concurrent.futures()

如何在python concurrent.futures中拆分concurrent.futures()
EN

Stack Overflow用户
提问于 2016-07-19 14:38:39
回答 5查看 7K关注 0票数 9

我在和concurrent.futures玩。

目前我的未来打电话给time.sleep(secs)

看来Future.cancel()做的事情比我想象的要少。

如果未来已经在执行,那么time.sleep()就不会被它取消。

等()的超时值参数也是一样的。它不会取消我的time.sleep()

如何取消在time.sleep()中执行的concurrent.futures?

为了进行测试,我使用了ThreadPoolExecutor

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-25 07:59:52

如果向ThreadPoolExecutor提交函数,执行器将在线程中运行该函数,并将其返回值存储在Future对象中。由于并发线程的数量是有限的,所以您可以选择取消对未来的挂起的执行,但是一旦将工作线程中的控件传递给可调用程序,就无法停止执行。

请考虑以下代码:

代码语言:javascript
复制
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秒过去之后继续执行。

票数 6
EN

Stack Overflow用户

发布于 2016-07-28 06:34:56

我对concurrent.futures不太了解,但是您可以使用这个逻辑来打破时间。使用循环代替sleep.time()或wait()

代码语言:javascript
复制
for i in range(sec):
    sleep(1)

中断或中断可以用来脱离循环。

票数 2
EN

Stack Overflow用户

发布于 2022-04-21 04:03:15

我想通了。

下面是一个例子:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38461603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档