python-3.x - 如何在循环内异步运行方法
问题描述
在下面的情况下如何异步运行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)]
解决方案
我发现了我的错误 =)
我只需要将 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)
推荐阅读
- python - Python Socket HTTP 代理:转发请求
- html - align-content 不适用于 chrome 网格
- php - AWS EC2 /bin/php 不执行 php 脚本
- javascript - 如何使用 Typescript + Jest 测试 vuejs 道具
- ionic-framework - 在测试中未为离子输入呈现输入
- javascript - Firestore onSnapshot 通过 onEffect 中的状态附加到数组
- python - 在 SQLAlchemy 中,如果使用 NullPool,是否只需要实例化 Engine 对象一次?
- vb.net - clickonce 应用程序可以知道它是从哪个目录安装的吗?
- javascript - MongoDB 无法运行 MacOS
- python - DRF-通过模型在 M2M 中创建新实例时出错