2

最近我一直在玩一些 python 3 异步功能。总的来说,我对 3.6 语法很满意,当然还有你获得的性能提升。ASGI在我看来,围绕标准发展的令人兴奋的项目之一是starlette。我有一个示例应用程序正在运行,我正在从hdf5文件中读取数据。h5py还不支持异步 I/O。这给我留下了一个问题:我在这里所做的一切有意义吗?据我了解,这段代码毕竟是同步运行的。在异步上下文中执行 I/O 的推荐方法是什么?

async def _flow(indexes):
    print('received flow indexes %s ' %indexes)
    # uses h5py under the hood
    gr = GridH5ResultAdmin(gridadmin_f, results_f)
    t = gr.nodes.timeseries(indexes=indexes)
    data = t.only('s1').data
    # data is a numpy array
    return data['s1'].tolist()

@app.route('/flow_velocity')
async def flow_results(request):

    indexes_list = [[2,3,4,5], [6,7,8,9], [10,11,12,13]]

    tasks = []
    loop = asyncio.get_event_loop()
    t0 = datetime.datetime.now()
    for indexes in indexes_list:
        print('Start getting indexes %s' % indexes)
        # Launch a coroutine for each data fetch
        task = loop.create_task(_flow(indexes))
        tasks.append(task)

    # Wait on, and then gather, all data
    flow_data = await asyncio.gather(*tasks)
    dt = (datetime.datetime.now() - t0).total_seconds()
    print('elapsed time: {} [s]'.format(dt))

    return JSONResponse({'flow_velocity': flow_data})

记录:

INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Start getting indexes "[2, 3, 4, 5]"
Start getting indexes "[6, 7, 8, 9]"
Start getting indexes "[10, 11, 12, 13]"
received flow indexes [2, 3, 4, 5] 
received flow indexes [6, 7, 8, 9] 
received flow indexes [10, 11, 12, 13]
elapsed time: 1.49779 [s]
4

1 回答 1

2

不幸的是,h5py你不能使用模块asyncio,你在这里所做的主要是顺序的,因为如果 I/O 部分不能异步完成,那么你的异步代码的其余部分就没有多大意义了

https://github.com/h5py/h5py/issues/837

该线程的摘要

因此,添加 asyncio 支持有两个不同的问题:

  1. asyncio 目前明确不支持文件系统 I/O,参见例如https://github.com/python/asyncio/wiki/ThirdParty#filesystemhttps://groups.google.com/forum/#!topic/python -tulip/MvpkQeetWZA , POSIX 异步 I/O (AIO) 的状态如何?, 和https://github.com/Tinche/aiofiles这是最接近你想要的。
  2. 所有 I/O 都是通过 HDF5(库)完成的,因此您想要添加的任何异步支持都需要 HDF5(库)中的支持

这基本上意味着 h5py 不太可能支持 asyncio。

您可以尝试在线程中运行,但不能保证它会正常工作,正如我所提到的,HDF5 控制 I/O,并且您需要确保不会遇到任何锁定控制。您可能想了解http://docs.h5py.org/en/latest/high/file.html#file-drivers中提到的哪种文件模式最适合您。也许您可以考虑其他替代方案,例如 multiprocessing 或 concurrent.futures?

于 2019-08-01T03:16:05.490 回答