记住并发异步python函数调用
aiomemoizeconcurrent的Python项目详细描述
全同型
记住并发的Asyncio Python协同程序调用。这提供了短暂的记忆:对于任何给定的参数集,缓存只持续一次调用的长度。
安装
pip install aiomemoizeconcurrent
用法
对于其参数是散列的协程,可以通过将其传递给memoize_concurrent
来创建memoized版本。对此版本的任何具有相同参数的并发调用都将只导致原始协程的single运行
例如,创建一个协程的3个并发调用,其中2个具有相同的参数
importasynciofromaiomemoizeconcurrentimportmemoize_concurrentasyncdefmain():memoized_coro=memoize_concurrent(coro)results=awaitasyncio.gather(*[memoized_coro('a'),memoized_coro('a'),memoized_coro('b'),])print(results)awaitmemoized_coro('a')asyncdefcoro(value):print('Inside coro',value)awaitasyncio.sleep(1)returnvalueloop=asyncio.get_event_loop()loop.run_until_complete(main())loop.close()
只运行coro
两次,如输出所示
Inside coro a
Inside coro b
['a', 'a', 'b']
用例
这可用于记录调用api的函数,特别是在
- 您希望有许多并发调用;
- 相同的并发调用是等幂的;
- 有足够多的这样的调用是相同的,以证明这样一个缓存层的合理性
它还可用于避免多个任务访问共享资源时出现并发边缘情况/竞争条件。例如,多个任务可能需要动态创建共享的udp套接字。为了确保此动态生成不被同一地址的多个任务同时调用,可以用memoize_concurrent
包装它
函数memoize_concurrent
既可用于协同过程,也可用于返回未来的函数