同时绿叶限制率

2024-06-01 01:02:35 发布

您现在位置:Python中文网/ 问答频道 /正文

为了实现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}$

一个明显的缺点是,工人以无序的方式从队列中抓取任务。然而,我想,大多数用例不需要工人之间的任何特定顺序。在

你有没有看到其他缺点?有其他选择吗?在


Tags: fromimportdefaultifqueuedefgeventtq