PY3.5+异步的限制工具。

asyncio-throttler的Python项目详细描述


asyncioasync/await是非常棒的工具! 异步的东西!用Python!没有精神错乱!

不幸的是,考虑到这种编程风格的本质 有时候不容易。

这个项目至少提供了一个工具来帮助你 相当简单的方法。

asyncio\u throttler是一个针对python 3.5+的节流系统,设计用于 AYOHTTP节流,但设计灵活,足以应付 大多数节流和速率限制需要。

用法

好吧,明白了:

$ pyvenv env/
$ . env/bin/activate
$ pip install asyncio_throttler # Pin the damned version in setup.py
                                # you bloody savage.

如果没有python 3.5,请查看 pyenv(不要与 pyvenv),一个类似于rbenv的python版本管理器。

如果您真的不想要pyenv,brew install python3将 非破坏性地安装Python3.5+。

无论如何,下面是我在开发 事情。这段代码有很好的文档记录,简洁,而且希望很容易 人类可以理解,但这应该开始了。我来做 更好的医生,我保证。我总有一天会睡着的。

警告:这将永远不会完成,油门错误将反弹 永远在你身边。故意地。证明事情不会迷路。 说真的。

"""Dump test module I built while writing this thing. Need to make real tests,
but whatcha gonna do ya got schedules and stuff amirite?

"""importloggingimportasynciofromasyncio_throttlerimportThrottler,ThrottleException# Demonstrates that windowing, throttling, and every other known feature# works, I think.if__name__=='__main__':logger=logging.getLogger('testthrottler')logger.setLevel(logging.DEBUG)handler=logging.StreamHandler()format_template='%(asctime)s:%(name)s:%(levelname)s%(message)s'handler.setFormatter(logging.Formatter(fmt=format_template,datefmt='%Y-%m-%d %H:%M:%S'))logger.addHandler(handler)asyncdefdummy_consumer(item):print("Item received:",item)awaitasyncio.sleep(2)importrandomasyncdefdummy_task():logger.info("Executed")returnawaitasyncio.sleep(1,random.randrange(1,1000))asyncdefbad_dummy_task():logger.info("Executed and gonna throw a throttle")raiseThrottleException(bad_dummy_task())loop=asyncio.get_event_loop()# roflcoptrtodo_list=[dummy_task()for_inrange(1,31)]todo_list.append(bad_dummy_task())todo_list=todo_list+[dummy_task()for_inrange(1,31)]throttler=Throttler(todo_list,dummy_consumer,time_window=10,per_time_window=20,concurrency=5,log_handler=logging.StreamHandler(),log_level=logging.DEBUG,loop=loop)loop.run_until_complete(throttler.run())loop.close()

工作原理

throttler被实例化为一个可等待的列表,一个异步的 函数和许多关键字arg旋钮,您可以调整以适应 目的。

里面有两个asyncio.Queue对象和一个asyncio.LifoQueue

  • exceptions是我们捕获的非限制性异常的Queue
  • processed是已处理输出的Queue。这就是你的 消费者将从消费。
  • todo是保存未处理任务列表的LifoQueue。 它最初是从您传递给的列表中的reverse馈送的 Throttler,它是一个快速的迭代器。只是LIFO而已 我们可以在前面弹出受限制的项目。

多个内部函数组成一个异步生产者和 消费者循环,在给定 在Throttler实例化时施加的限制。它会后退的 time_window限制时,只执行 一次执行任务,并在触发 处理per_time_window项。

应该包括几个案例…

无论如何,您传入的异步consumer_fn将作为 结果立即可用于写入磁盘或其他文件。

注释

这很痛苦。

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

推荐PyPI第三方库


热门话题
在Java中使用BufferedReader类读取文本文件的子字符串   java如何在JSP页面上包含来自另一台服务器的动态JSP   使用单表策略的java持久化Hibernate继承映射   java报告状态失败达600秒。谋杀!报告hadoop的进展   java将字符串解析为形状   使用JTable的java ClassCastException?   java在Spring引导中关闭数据库   java Android Studio调试错误(Ubuntu)   java如何区分apache beam中KV实例中的两个键?   java将RealmObjectChangeListener添加到异步下载的RealmObject   java匹配模式之前的所有内容,包括新行和/或回车   java使用JAXB在XML中动态更改元素序列   java如何在MACOS中找到动态库(.dylib文件)的版本   Android中的java Nanohttpd服务器   java libGDX:3d动画不工作