内容简介:最近在看celery代码,看到worker的代码,发现了tocket bucket算法,自己之前还一直 在想像有些API对调用次数有限制是怎么做到的,看完才发现,原来是这么朴素的算法。 真是无知,无知啊。嗯,以后要多读读源码。celery外链里但是写上了注释的代码(稍微做了一些改动):.. code:: python
最近在看celery代码,看到worker的代码,发现了tocket bucket算法,自己之前还一直 在想像有些API对调用次数有限制是怎么做到的,看完才发现,原来是这么朴素的算法。 真是无知,无知啊。嗯,以后要多读读源码。
celery外链里但是写上了注释的代码(稍微做了一些改动):
.. code:: python
# coding: utf-8 import time
class TokenBucket(object): def __init__(self, tokens, fill_rate): """tokens is the total tokens in the bucket. fill_rate is the rate in tokens/second that the bucket will be refilled.""" self.capacity = tokens # 桶的容量 self._tokens = tokens # 令牌们 self.fill_rate = fill_rate # 每秒放入的令牌数量 self.timestamp = int(time.time()) # 上次请求令牌的时间 def consume(self, tokens): """Consume tokens from the bucket. Returns True if there were sufficient tokens otherwise False.""" if tokens <= self.__get_tokens(): self._tokens -= tokens else: return False return True def __get_tokens(self): now = int(time.time()) if self._tokens < self.capacity: delta = self.fill_rate * (now - self.timestamp) self._tokens = min(self.capacity, self._tokens + delta) print("delta: %s" % delta) self.timestamp = now return self._tokens if __name__ == "__main__": bucket = TokenBucket(80, 1) print("tokens = %s" % bucket._tokens) print("consume(10) = %s" % bucket.consume(10)) print("consume(10) = %s" % bucket.consume(10)) time.sleep(1) print("tokens = %s" % bucket._tokens) time.sleep(1) print("tokens = %s" % bucket._tokens) print("consume(90) = %s" % bucket.consume(90)) print("tokens = %s" % bucket._tokens) print("consume(90) = %s" % bucket.consume(90)) print("tokens = %s" % bucket._tokens)
我们看一下测试结果:
.. code:: bash
$ python token_bucket.py tokens = 80 consume(10) = True delta: 0 consume(10) = True tokens = 60 tokens = 60 delta: 2 consume(90) = False tokens = 62 delta: 0 consume(90) = False tokens = 62
最后我们用大白话来描述一下上面的代码:
1,初始化的时候,指定了桶的大小和每秒钟放入令牌的速率
2,每次消耗令牌的时候,都会计算,上次消耗到本次消耗之间产生了多少令牌,如果产生 令牌的数量超过了容量,则丢弃多余的令牌。
3,如果要消耗的令牌数量大于现有的令牌数量,则返回失败。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 通俗易懂--决策树算法、随机森林算法讲解(算法+案例)
- 限流算法之漏桶算法、令牌桶算法
- 什么是Paxos算法?Paxos算法是区块链核心算法之一
- 一文读懂对称加密算法、非对称加密算法和Hash算法
- 算法(六):图解贪婪算法
- 算法篇03:排序算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
跨境电商——阿里巴巴速卖通宝典
速卖通大学 编著 / 电子工业出版社 / 2015-1 / 69.00元
跨境电商作为中国电子商务发展的最新趋势,受到了全社会越来越多的重视,大量中国卖家借助阿里巴巴速卖通平台,将产品直接售卖到全球的消费者手中,通过这条短得不能再短的交易链,获得了丰厚的回报。 但同时,跨境电商这一贸易形式,对卖家的综合素质要求比较高:卖家要对海外市场比较熟悉,对跨境物流有所把握,能够用外语进行产品介绍和客户交流,通过跨境结算拿到货款……诸如此类的门槛,让不少新卖家心生畏难,而所有......一起来看看 《跨境电商——阿里巴巴速卖通宝典》 这本书的介绍吧!