【问题标题】:Why is my asynchronous version of my python script not faster than the synchronous version?为什么我的 python 脚本的异步版本不比同步版本快?
【发布时间】:2020-08-03 22:18:38
【问题描述】:

我刚刚开始在 python 中试验 asyncio 库。 我的目的是加快我的代码速度,但是对于我的第一个脚本来说,确实没有比不使用 asyncio 更好的地方。

from yahoo_fin import stock_info as si
from yahoo_fin.stock_info import *
import time
import asyncio

async def price(stock):

    prijs = str(si.get_live_price(stock))
    await asyncio.sleep(0.001)
    print(prijs)


def main():
    loop = asyncio.get_event_loop()
    t0 = time.time()
    task =  asyncio.gather(
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe')

    )
    loop.run_until_complete(task)

    t1 = time.time()
    print("took %.2f ms" % (1000*(t1-t0)))

if __name__ == '__main__':
    main()

如果我比较它而不对其进行异步编码:

from yahoo_fin import stock_info as si
from yahoo_fin.stock_info import *
import time
import asyncio

def price(stock):
    prijs = str(si.get_live_price(stock))
    print(prijs)


def main():

        t0 = time.time()

        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('aapl'),
        price('fcx'),
        price('acn'),
        price('adbe')



        t1 = time.time()
        print("took %.2f ms" % (1000*(t1-t0)))


if __name__ == '__main__':
    main()

我认为异步版本会同时运行所有 price() 调用,从而减少执行程序的时间?我是不是做错了什么?

谢谢

【问题讨论】:

  • 如果str(si.get_live_price(stock)) 没有并行化,那么同时进行睡眠基本上没有好处。

标签: python python-asyncio


【解决方案1】:

你在这里没有做错任何事。但是你对python中异步的理解是有缺陷的。

由于 GIL,Python 不能同时做两件事。是不可能的。你可以假装用 python 线程和异步做多件事,但这不是真正的多任务处理。如果你想要真正的多任务处理,你需要在 python 中使用multiprocessing 模块,但这超出了这个问题的范围。

所以基本上是异步的,当你等待一个函数时,你告诉 python 嘿,这个调用正在做一些需要时间才能返回的事情,但是等待意味着 python 没有计算任何它实际上正在等待的东西,例如做IO 绑定任务不是 CPU 任务。你的程序是 100% CPU 受限的,因为你不是在等待磁盘找到东西或使用异步函数通过网络发送/接收数据。

你的程序是这样说的。我将调用si.get_live_price(stock) 一个非异步函数并等待(而不是等待)结果。之后,我将异步睡眠 0.001,以便其他人可以工作,但在 0.001 之后没有其他人可以工作,因为我想要再次控制,所以我可以通过打印到控制台来完成。一旦它打印出来的python现在将专注于下一个任务,它将重复上述步骤。

这是一个可能需要一些时间才能完全理解的主题,但我的建议是查找 python 中并发和并行性之间的区别。

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2017-07-11
    相关资源
    最近更新 更多