为何asyncio事件循环会按顺序执行任务?
Asyncio任务未交错执行,而是顺序执行
现象
执行代码后,任务按顺序执行,输出如下:
start = ticker_1 finish = ticker_1 start = ticker_2 finish = ticker_2 start = ticker_3 finish = ticker_3 etc.
相关代码
import asyncio import other_libs tikers_list = ['ticker_1', 'ticker_2', 'ticker_3', ..., 'ticker_n'] # Worker async def fn_load_and_calc(ticker, row_calc): print(f'start = {ticker}') # 函数内部执行以下操作: # - 通过API或不同数据提供商的库将行情数据加载到Pandas # - 为Pandas表格添加字段并填充计算值 # - 将Pandas表格保存为csv和xlsx文件 # - 在命令行显示事件 # 代码执行完成约需2秒 print(f'finish = {ticker}') # Variant 1 def make_asyncio(): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) tasks = [] row_calc = 0 for ticker in tikers_list: row_calc += 1 tasks.append(loop.create_task(fn_load_and_calc(ticker, row_calc))) wait_tasks = asyncio.wait(tasks) loop.run_until_complete(wait_tasks) loop.close() make_asyncio() # Variant 2 适用于新版Python def make_asyncio(): row_calc = 0 async with asyncio.TaskGroup() as tg: for ticker in tikers_list: row_calc += 1 tg.create_task(load_and_calc(asset, ticker, row_calc, SCENARIO)) asyncio.run(make_asyncio())
预期输出
希望任务交错执行,输出示例如下:
start = ticker_1 start = ticker_2 finish = ticker_1 start = ticker_3 finish = ticker_2 finish = ticker_3 etc.
疑问
我的问题出在哪里?
- 是否因为asyncio任务中仅传入不同参数调用同一个
fn_load_and_calc函数导致顺序执行?但我查阅的大量示例中这并非问题。 - 是否需要将
fn_load_and_calc函数改为类并调用其实例?
补充说明:使用multiprocessing、ThreadPool的版本可正常工作。
内容的提问来源于stack exchange,提问作者kealog
相关产品推荐
相关产品推荐

