You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:53:17