编程语言
首页 > 编程语言> > python – 限制传入消息以避免重复的最佳方法

python – 限制传入消息以避免重复的最佳方法

作者:互联网

我有一个系统接受包含网址的邮件,如果邮件中包含某些关键字,则使用网址作为参数进行API调用.

为了节省处理并保持我的最终演示效率.

我不希望在特定时间范围内提交重复的网址.

所以如果这个网址—> http://instagram.com/p/gHVMxltq_8/进来,它被提交给api

          url = incoming.msg['urls']
          url = urlparse(url)
          if url.netloc  == "instagram.com":                
            r = requests.get("http://api.some.url/show?url=%s"% url)

然后3秒后相同的网址进来,我不希望它提交给api.

我可以部署什么编程方法来消除/限制根据时间提交给api的重复消息?

使用TIM PETERS方法更新:

         limit = DecayingSet(86400)
         l = limit.add(longUrl)
         if l == False:
           pass
         else:
           r = requests.get("http://api.some.url/show?url=%s"% url)

此片段位于长时间运行的进程中,即通过tcp接受流式消息.

每次我传入相同的url时,l每次都返回True.

但是当我在解释器中尝试它时一切都很好,当设置的时间没有到期时它返回False.

它是否与脚本正在运行的事实有关,而该集正在被添加到?

实例问题?

解决方法:

也许是矫枉过正,但我​​喜欢为这种事创造一个新类.你永远不知道什么时候需求会变得更加漂亮;-)例如,

from time import time

class DecayingSet:
    def __init__(self, timeout): # timeout in seconds
        from collections import deque
        self.timeout = timeout
        self.d = deque()
        self.present = set()

    def add(self, thing):
        # Return True if `thing` not already in set,
        # else return False.
        result = thing not in self.present
        if result:
            self.present.add(thing)
            self.d.append((time(), thing))
        self.clean()
        return result

    def clean(self):
        # forget stuff added >= `timeout` seconds ago
        now = time()
        d = self.d
        while d and now - d[0][0] >= self.timeout:
            _, thing = d.popleft()
            self.present.remove(thing)

如上所述,只要尝试添加新内容,它就会检查到期时间.也许这不是你想要的,但它应该是一个便宜的检查,因为deque按照添加的顺序保存项目,所以如果没有项目到期则立即退出.很多可能性.

为何选择双端队列?因为deque.popleft()比list.pop(0)快很多,当项目数变得非常重要时.

标签:python,algorithm,parsing,message-queue,messaging
来源: https://codeday.me/bug/20190831/1775338.html