【问题标题】:Ignoring unused futures with ThreadPoolExecutor使用 ThreadPoolExecutor 忽略未使用的期货
【发布时间】:2019-01-02 17:02:05
【问题描述】:

我正在使用 ThreadPoolExecutor 并行运行两个函数,fast()slow()。如果fast() 返回非None 结果,我想使用它,否则,使用slow() 结果。这是一个例子:

from concurrent.futures import ThreadPoolExecutor
from time import sleep

def fast():
    sleep(2)
    return 'fast'

def slow():
    sleep(4)
    return 'slow'

def run_parallel():
    with ThreadPoolExecutor() as executor:
        fast_future = executor.submit(fast)
        slow_future = executor.submit(slow)

        fast_result = fast_future.result()
        if fast_result is not None:
            slow_future.cancel()
            return fast_result

        return slow_future.result()

print(run_parallel())

运行输出:

$ time python example.py 
fast

real    0m4.058s
user    0m0.041s
sys 0m0.011s

由于fast() 返回一个非None 值,我预计这需要2 秒而不是4 秒,特别是因为我有那条线到slow_future.cancel()

我的理想语法是这样的:

combined_future = fast_future.orElse(slow_future)
return combined_future.result()

我可以做些什么来获得这种预期的行为?

【问题讨论】:

    标签: python future threadpoolexecutor


    【解决方案1】:

    这是由于缓慢的未来不可取消(slow_future.cancel() 返回 False),因此线程池执行器等待线程。 尝试类似:

    from concurrent.futures import ThreadPoolExecutor, as_completed
    from time import sleep
    
    abort_flag = False
    
    
    def fast():
        for i in range(20):
            if abort_flag:
                return None
            sleep(.1)
        return 'fast'
    
    
    def slow():
        for i in range(40):
            if abort_flag:
                return None
            sleep(.1)
        return 'slow'
    
    
    def run_parallel():
        global abort_flag
        with ThreadPoolExecutor() as executor:
            abort_flag = False
            fast_future = executor.submit(fast)
            slow_future = executor.submit(slow)
            for f in as_completed((fast_future, slow_future)):
                result = f.result()
                if result is not None:
                    abort_flag = True
                    return result
    
    
    print(run_parallel())
    

    【讨论】:

      猜你喜欢
      • 2021-01-10
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 2020-06-08
      • 2017-02-06
      • 2020-11-03
      相关资源
      最近更新 更多