我刚刚开始在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()调用,从而减少执行程序的时间?我做错什么了吗
谢谢
你没有做错什么。然而,您对python中异步的理解是有缺陷的
由于GIL,Python不能同时做两件事。这是不可能的。您可以假装使用python线程和异步执行多项任务,但这不是真正的多任务处理。如果您想要真正的多任务处理,您需要使用python中的
multiprocessing
模块,但这超出了这个问题的范围因此,基本上在异步中,当您等待一个函数时,您会告诉python这个调用正在做一些需要时间才能返回的事情,然而,等待意味着python没有计算它实际上正在等待的任何事情,例如,执行IO绑定的任务,而不是CPU任务。这里的程序100%受CPU限制,因为您不需要等待磁盘查找内容,也不需要使用异步函数通过网络发送/接收数据
你的程序是这样说的。我将调用
si.get_live_price(stock)
一个非异步函数并等待(而不是等待)结果。在此之后,我将异步睡眠0.001,以便其他人可以工作,但在0.001之后,没有其他人可以工作,因为我想再次控制,以便我可以通过打印到控制台来完成。一旦打印出来,python现在将专注于下一个任务,该任务将重复上述步骤这是一个需要一些时间才能完全理解的主题,但我的建议是查找python中并发性和并行性之间的区别
相关问题 更多 >
编程相关推荐