为什么我的python脚本的异步版本没有比同步版本快?

时间:2020-08-03 22:18:38

标签: python python-asyncio

我刚刚开始尝试使用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()调用,从而减少了执行程序的时间?我做错什么了吗?

谢谢

1 个答案:

答案 0 :(得分:4)

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

由于GIL,Python 不能同时执行两项操作。是不可能的。您可以使用python线程和异步功能伪造多个功能,但这并不是真正的多任务处理。如果您想要真正的多任务处理,则需要在python中使用action模块,但这不在此问题的范围内。

因此基本上在异步中,当您等待函数时,您告诉python嘿,此调用正在做某些事情,它需要花费一些时间才能返回,但是,等待意味着python并未计算其字面上正在等待的东西,例如IO绑定任务不是CPU任务。您正在这里编程是100%CPU限制,因为您不需要等待磁盘使用异步功能通过网络查找内容或发送/接收数据。

您的程序正在这样说。我将multiprocessing称为非异步函数,然后等待(而不是等待)结果。之后,我将异步睡眠0.001,以便其他人可以工作,但是0.001之后,其他任何人都无法工作,因为我想要再次控制,因此可以通过打印到控制台来完成。一旦其打印的python现在将专注于下一个任务,该任务将重复上述步骤。

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