代码之家  ›  专栏  ›  技术社区  ›  Scott Deerwester

为什么不并发.futures.threadpoolExecutor()。立即提交返回?

  •  1
  • Scott Deerwester  · 技术社区  · 6 年前

    在本代码中:

    import concurrent.futures
    import time
    
    def pafter(t):
        time.sleep(t)
        print('Hi')
    
    with concurrent.futures.ThreadPoolExecutor(5) as e:
        e.submit(pafter, 2)
    
    print('With returned')
    

    我希望看到:

    With returned
    Hi
    

    但我明白:

    Hi
    With returned
    

    为什么不 submit 立即返回?我该如何改变才能做到这一点?

    1 回复  |  直到 6 年前
        1
  •  3
  •   dano    6 年前

    使用 with 语句等价于调用 executor.shutdown() , which is documented like this :

    shutdown(wait=True)

    向执行者发出信号,表示在当前挂起的期货执行完毕时,它应该释放正在使用的任何资源。在关闭后调用executor.submit()和executor.map()将引发RuntimeError。

    如果wait为true,则此方法将不会返回,直到所有挂起的期货执行完毕并且与执行者关联的资源被释放为止。 . 如果wait为false,则此方法将立即返回,并且在所有挂起的期货执行完毕后,将释放与执行者关联的资源。不管wait的值是多少,整个python程序都不会退出,直到所有待定的预购完成执行。

    如果使用WITH语句,则可以避免显式调用此方法,因为WITH语句将关闭执行器(就像调用executor.shutdown()时wait设置为true一样等待)。

    粗体部分解释了你所看到的行为; submit() 呼叫确实立即返回,但 具有 语句将一直阻塞,直到所有提交的工作完成。要更改它,您不需要使用 具有 语句,而不是显式调用 shutdown(wait=False) .