PY3.5+异步的限制工具。
asyncio-throttler的Python项目详细描述
asyncio和async/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将作为 结果立即可用于写入磁盘或其他文件。
注释
这很痛苦。