我刚刚开始尝试使用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()调用,从而减少了执行程序的时间?我做错什么了吗?
谢谢
答案 0 :(得分:4)
您在这里没有做错任何事情。但是,您对python中异步的理解是有缺陷的。
由于GIL,Python 不能同时执行两项操作。是不可能的。您可以使用python线程和异步功能伪造多个功能,但这并不是真正的多任务处理。如果您想要真正的多任务处理,则需要在python中使用action
模块,但这不在此问题的范围内。
因此基本上在异步中,当您等待函数时,您告诉python嘿,此调用正在做某些事情,它需要花费一些时间才能返回,但是,等待意味着python并未计算其字面上正在等待的东西,例如IO绑定任务不是CPU任务。您正在这里编程是100%CPU限制,因为您不需要等待磁盘使用异步功能通过网络查找内容或发送/接收数据。
您的程序正在这样说。我将multiprocessing
称为非异步函数,然后等待(而不是等待)结果。之后,我将异步睡眠0.001,以便其他人可以工作,但是0.001之后,其他任何人都无法工作,因为我想要再次控制,因此可以通过打印到控制台来完成。一旦其打印的python现在将专注于下一个任务,该任务将重复上述步骤。
这是一个可能需要一段时间才能完全理解的主题,但我的建议是查找python中并发性和并行性之间的区别。