在一篇文章 理解Python异步编程的基本原理 这篇文章中,我们讲到,如果在异步代码里面又包含了一段非常耗时的同步代码,异步代码就会被卡住。
那么有没有办法让同步代码与异步代码看起来也是同时运行的呢"text-align: center">
那么怎么使用呢"htmlcode">
def sync_calc_fib(n): if n in [1, 2]: return1 return sync_calc_fib(n - 1) + sync_calc_fib(n - 2) async def calc_fib(n): result = sync_calc_fib(n) print(f'第 {n} 项计算完成,结果是:{result}') return result
我们现在需要用 aiohttp 访问一个延迟5秒的网页,同时计算斐波那契数列第36项。
首先我们看看单独计算第36项需要5秒钟:
我们再来看看如果直接把这计算斐波那契数列和请求网站的两个异步任务放在一起“并行”,实际时间是两个任务的时间叠加:
具体原因我在上一篇文章里面已经做了说明。
现在,我想让两个任务“同时运行”,于是就可以这样修改代码:
import aiohttp import asyncio import time from concurrent.futures import ThreadPoolExecutor async def request(sleep_time): async with aiohttp.ClientSession() as client: resp = await client.get(f'http://127.0.0.1:8000/sleep/{sleep_time}') resp_json = await resp.json() print(resp_json) def sync_calc_fib(n): if n in [1, 2]: return 1 return sync_calc_fib(n - 1) + sync_calc_fib(n - 2) def calc_fib(n): result = sync_calc_fib(n) print(f'第 {n} 项计算完成,结果是:{result}') return result async def main(): start = time.perf_counter() loop = asyncio.get_event_loop() with ThreadPoolExecutor(max_workers=4) as executor: tasks_list = [ loop.run_in_executor(executor, calc_fib, 36), asyncio.create_task(request(5)) ] await asyncio.gather(*tasks_list) end = time.perf_counter() print(f'总计耗时:{end - start}') asyncio.run(main())
运行效果如下图所示:
在5秒钟的时间,就把计算斐波那契数列和请求5秒延迟的网站都做完了。
实现这样的转变,关键的代码就是:loop.run_in_executor(executor, calc_fib, 36)
其中的 loop就是主线程的事件循环(event loop),它是用来调度同一个线程里面的多个协程。
executor是我们使用ThreadPoolExecutor(max_workers=4)创建的一个有4个线程的线程池,calc_fib是一个耗时的同步函数,36是传入calc_fib的参数。loop.run_in_executor(executor, calc_fib, 36)的意思是说:
- 把calc_fib函数放到线程池里面去运行
- 给线程池增加一个回调函数,这个回调函数会在运行结束后的下一次事件循环把结果保存下来。
请注意上图中红色箭头对应的calc_fib这是一个同步函数,请与上一篇文章中的异步函数区分开。run_in_executor的第二个参数需要是一个同步函数的函数名。
在上面的例子中,我们创建的是有4个线程的线程池。所以这个线程池最多允许4个阻塞式的同步函数“并行”。
总结
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月18日
2024年11月18日
- 好薇2024《兵哥哥》1:124K黄金母盘[WAV+CUE]
- 胡歌.2006-珍惜(EP)【步升大风】【FLAC分轨】
- 洪荣宏.2014-拼乎自己看【华特】【WAV+CUE】
- 伊能静.1999-从脆弱到勇敢1987-1996精选2CD【华纳】【WAV+CUE】
- 刘亮鹭《汽车DJ玩主》[WAV+CUE][1.1G]
- 张杰《最接近天堂的地方》天娱传媒[WAV+CUE][1.1G]
- 群星《2022年度发烧天碟》无损黑胶碟 2CD[WAV+CUE][1.4G]
- 罗文1983-罗文甄妮-射雕英雄传(纯银AMCD)[WAV+CUE]
- 群星《亚洲故事香港纯弦》雨果UPMAGCD2024[低速原抓WAV+CUE]
- 群星《经典咏流传》限量1:1母盘直刻[低速原抓WAV+CUE]
- 庾澄庆1993《老实情歌》福茂唱片[WAV+CUE][1G]
- 许巍《在别处》美卡首版[WAV+CUE][1G]
- 林子祥《单手拍掌》华纳香港版[WAV+CUE][1G]
- 郑秀文.1997-我们的主题曲【华纳】【WAV+CUE】
- 群星.2001-生命因爱动听电影原创音乐AVCD【MEDIA】【WAV+CUE】