首页 > 解决方案 > 如何在循环内异步运行方法

问题描述

在下面的情况下如何异步运行bar() ?
我想循环运行foo()bar()。但我不想等待bar()完全执行并继续下一次迭代。
打印结果表明它是逐步工作的,而不是异步工作的。

import time
import concurrent
from concurrent.futures.thread import ThreadPoolExecutor

def func_foo_bar(j,executor):
    foo(j)
    bar(j,executor)

def foo(j):
    [print(f"FOO calling {j}{i}") for i in range(3)]

def bar(j, executor):
    future_slow = {executor.submit(slow_func, j,x): x for x in range(3)}
    for future in concurrent.futures.as_completed(future_slow):
        if not future.exception():
            r = future.result()
            # print(r)

def slow_func(j,i):
    time.sleep(2)
    print(f"BAR calling {j}{i}")

executor = ThreadPoolExecutor(max_workers=5)
[func_foo_bar(x, executor) for x in range(3)]

标签: python-3.xasynchronous

解决方案


我发现了我的错误 =)
我只需要将 as_completed 方法移出循环:

import time
import concurrent
from concurrent.futures.thread import ThreadPoolExecutor

def func_foo_bar(j,executor):
    foo(j)
    future_slow=bar(j,executor)
    return future_slow

def foo(j):
    # time.sleep(2)
    [print(f"FOO calling {j}{i}") for i in range(3)]

def bar(j, executor):
    future_slow = [executor.submit(slow_func, j,x) for x in range(3)]
    return future_slow


def slow_func(j,i):
    time.sleep(3)
    print(f"BAR calling {j}{i}")

executor = ThreadPoolExecutor(max_workers=5)
future_slow_list=[func_foo_bar(x, executor) for x in range(5)]
for future_slow in future_slow_list:
    for future in concurrent.futures.as_completed(future_slow):
        if not future.exception():
            r = future.result()
            # print(r)

推荐阅读