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