协程异步IO
我们在之前介绍IO密集型应用的时候,提到多线程或协程都可以用来优化IO密集型应用,那我们这个脚本的场景可以用协程来优化吗?可惜理想是美好的,但现实是残酷的。大家是否还记得,我们在介绍协程的时候,提到了使用Python协程的一个限制,即必须有支持的库才行,也即需要有相应场景下支持异步IO的库,比如aiohttp、aiofiles。但我们使用pandas的read_excel()没有异步库的支持,所以即使我们使用了asyncio,实际还是同步阻塞IO,我们可以来验证一下,见下面代码和执行效果:
async def read_cp_df():
print('read_cp_df start')
read_cp_df_start = time.time()
global cp_df
cp_df = pd.read_excel(fpath,sheet_name='CP',header=[0])
read_cp_df_end = time.time()
print(f"读取excel文件cp sheet time cost is {read_cp_df_end - read_cp_df_start}: seconds")
async def read_ds_df():
print('read_ds_df start')
read_ds_df_start = time.time()
global ds_df
ds_df = pd.read_excel(fpath,sheet_name='DS',header=[0,1])
read_ds_df_end = time.time()
print(f"读取excel文件ds sheet time cost is {read_ds_df_end - read_ds_df_start}: seconds")
async def read_excel():
read_excel_start = time.time()
#把CP和DS两个sheet的数据分别读入pandas的dataframe
#启动两个协程读取excel的数据
cp_df_task = asyncio.create_task(read_cp_df())
ds_df_task = asyncio.create_task(read_ds_df())
print('befoe await cp_df_task')
await cp_df_task
print('after await cp_df_task')
await ds_df_task
print('after await ds_df_task')
read_excel_end = time.time()
print(f"读取excel文件 time cost is :{read_excel_end - read_excel_start} seconds"