为了实现greenlet限制,我使用gevent.queue.Queue
来实现令牌桶。
将模式转换为函数修饰符:
from functools import wraps
from timeit import default_timer
import gevent
from gevent.queue import Queue
def gevent_throttle(calls_per_sec=0):
"""Decorates a Greenlet function for throttling."""
interval = 1. / calls_per_sec if calls_per_sec else 0
def decorate(func):
tq = Queue(1)
tq.put(0.)
@wraps(func)
def throttled_func(*args, **kwargs):
if calls_per_sec:
last, current = tq.get(), default_timer()
elapsed = current - last
if elapsed < interval:
gevent.sleep(interval - elapsed)
tq.put_nowait(default_timer())
return func(*args, **kwargs)
return throttled_func
return decorate
示例:
^{pr2}$一个明显的缺点是,工人以无序的方式从队列中抓取任务。然而,我想,大多数用例不需要工人之间的任何特定顺序。在
你有没有看到其他缺点?有其他选择吗?在
目前没有回答
相关问题 更多 >
编程相关推荐