相似同时协程减速器

async-reduce的Python项目详细描述


Python versionsPyPI versioncoverage report

关于异步减少

async_reduce(coroutine)允许聚合所有相似的同时就绪 运行coroutines并减少到只运行一个coroutine。 其他聚合的coroutine将从单个coroutine获得结果。

它可以在 类似的异步操作,减少内部系统的负载。

快速示例

fromasync_reduceimportasync_reduceasyncdeffetch_user_data(user_id:int)->dict:"""" Get user data from inner service """url='http://inner-service/user/{}'.format(user_id)returnawaithttp.get(url,timeout=10).json()@web_server.router('/users/(\d+)')asyncdefhandler_user_detail(request,user_id:int):""" Handler for get detail information about user """# all simultaneous requests of fetching user data for `user_id` will # reduced to single requestuser_data=awaitasync_reduce(fetch_user_data(user_id))# sometimes ``async_reduce`` cannot detect similar coroutines and# you should provide special argument `ident` for manually determinationuser_statistics=awaitasync_reduce(DataBase.query('user_statistics').where(id=user_id).fetch_one(),ident='db_user_statistics:{}'.format(user_id))returnResponse(...)

在该示例中,如果客户端执行n,则不使用async_reduce 同时请求,如GET http://web_server/users/42web\u serverinner servicen查询database执行n请求。 总共:n同时请求向内部系统发出2*n请求。

使用async_reduce如果客户端执行n同时请求web服务器 执行oneinner serviceone的请求database的查询。 总共:n同时请求只向内部系统发出2请求。

见其他真实的examples

相似协程的确定

async_reduce(coroutine)尝试通过散列本地 变量在调用时有界。如果:

  • 其中一个参数不可哈希
  • 协程函数是一种具有特定状态的类方法(如orm)
  • coroutine函数具有对不可更改变量的闭包

通过将自定义键设置为参数ident,可以禁用自动确定。

用作装饰器

库还提供特殊的装饰符@async_reduceable(),例如:

fromasync_reduceimportasync_reduceable@async_reduceable()asyncdeffetch_user_data(user_id:int)->dict:"""" Get user data from inner service """url='http://inner-servicce/user/{}'.format(user_id)returnawaithttp.get(url,timeout=10).json()@web_server.router('/users/(\d+)')asyncdefhandler_user_detail(request,user_id:int):""" Handler for get detail information about user """returnawaitfetch_user_data(user_id)

挂钩

库支持挂钩。附加挂钩:

  • debughooks-打印所有已触发的挂钩
  • statisticsOverall挂钩-使用async_reduce的一般统计信息
  • statisticsdetailhooks-类似于StatisticsOverallHooks但是细节统计 关于由async_reduce
  • 处理的所有coroutine

示例:

fromasync_reduceimportAsyncReducerfromasync_reduce.hooksimportDebugHooks# define custom async_reduce with hooksasync_reduce=AsyncReducer(hooks=DebugHooks())asyncdefhandler_user_detail(request,user_id:int):user_data=awaitasync_reduce(fetch_user_data(user_id))

请参阅examples/example_hooks.py中的更多详细示例。

您可以通过inherit fromBaseHooks编写自定义钩子。

注意事项

  • 如果单个coroutine引发异常,则所有聚合的coroutine将获得 同样的例外

  • 如果单个coroutine被卡住,所有聚合的coroutine也将被卡住。 限制coroutine的执行时间,并添加重试(可选)以避免它。

  • coroutine返回可变值时要小心,因为单个值 将共享。更喜欢使用不可变的值作为协程返回。

开发

DEVELOPMENT.md

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
amazon web services Java AWS s3:如何使用Md5预签名url设置和上载内容   twitter使用java从推文中排除一些单词   如何在GUI java中添加延迟时间   java程序,如何使用Outputstream发送两次消息   java为什么是javax。在将Yasson与JSONB一起使用时,Glassfish中的json需要作为依赖项吗?   如何从dist文件夹中读取文件   java如何获取与模式匹配的文件列表   java如何使用Intent从Android应用程序发送彩信?   java限制对Spring的依赖,同时又不丧失框架的功能   java是否将捕获异常报告给Firebase/Fabric等?   用jdbcjava实现mysql分页   给定URI的java注释检索   java是序列化/反序列化公共枚举的简单方法?   java如何使用jMockit模拟本机方法