gpt4 book ai didi

python-3.x - Python 的 asyncio.gather() 似乎没有异步运行任务

转载 作者:行者123 更新时间:2023-12-02 16:13:54 26 4
gpt4 key购买 nike

我需要异步运行 20 个任务(每个任务运行相同的函数,但参数不同)。每个任务都使用 Python 的 yfinance API 模块。这是我目前的方法:

  1. 定义一个包含 20 个元素的列表 args;每个元素都是要传递给相应任务的参数。
  2. 定义一个异步函数 get_data,我将使用每次不同的参数运行 20 次。
  3. 定义一个异步函数 main,它将使用 asyncio.gather 异步运行 20 个任务。

这是(伪)代码:

import asyncio

stocks = []
args = ['arg1', 'arg2', ... , 'arg20']


async def get_data(arg):
stock = Stock(arg)
# do some yfinance calls
return stock


async def main():
global stocks
tasks = [asyncio.ensure_future(get_data(arg)) for arg in args]
stocks = await asyncio.gather(*tasks)


asyncio.run(main())

print(stocks) # should be a list of 20 return values from the 20 tasks

假设每个任务单独运行需要 4 秒。如果异步运行,则 20 个任务应在 4 秒内运行。但是,它会在 80 秒后运行。如果我删除所有异步代码并同步运行它,它会在相同的时间内运行。有帮助吗?

谢谢。

最佳答案

我已经检查了 yfinance 的文档,并在需求中看到了 requests 库,该库不是异步的。这意味着你不应该将它与 asyncio 模块一起使用,你应该使用 theading.Threadconcurrent.futures.ThreadPoolExecutor 代替。

我为您制作了以下示例,请运行它并分享您的结果。

from concurrent.futures import ThreadPoolExecutor
import yfinance as yf
from pprint import pprint
from time import monotonic


def get_stocks_data(name: str) -> dict:
"""some random function which extract some data"""
tick = yf.Ticker(name)
tick_info = tick.info
return tick_info


if __name__ == '__main__':
# some random stocks
stocks = [
'AAPL', 'AMD', 'AMZN', 'FB', 'GOOG', 'MSFT', 'TSLA', 'MSFT',
'AAPL', 'AMD', 'AMZN', 'FB', 'GOOG', 'MSFT', 'TSLA', 'MSFT',
]
start_time = monotonic()
# you can choose max_workers number higher and check if app works faster
# e.g choose 16 as max number of workers
with ThreadPoolExecutor(max_workers=4) as pool:
results = pool.map(get_stocks_data, stocks)

for r in results:
pprint(r)

print("*" * 150)
print(monotonic() - start_time)

关于python-3.x - Python 的 asyncio.gather() 似乎没有异步运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67260752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com