因此,我试图制作一个字典,其中将监视您所监视的每个产品,当有库存进货时,它将检查该字典并查看其中是否有该商品,如果没有,它将添加它。添加后,它将放入每个要补充库存的尺寸以及每个尺寸的时间戳。下次运行时,如果重新存储某些东西,它将采用这些大小并检查它们是否在字典中,如果是,则将当前时间戳与字典中的时间戳进行比较。基本上按尺寸放置冷却时间。
到目前为止,我已经做了一个演示:
import random
import sys
import time
import re
from datetime import timedelta, datetime
def randomNumber():
payload = {
"sizes": {}
}
numbers = {}
for x in range(10):
numbers.update({f'US {random.randint(1, 10)}': datetime.now()})
payload['sizes'] = numbers
return payload
def demo():
firstList = randomNumber()
while True:
secondList = randomNumber()
if len(secondList['sizes']) > len(firstList['sizes']): # Not sure if this is needed but couldn't get another other ideas here to compare
restockSizes = []
restocked = False
for key, value in secondList['sizes'].items():
if key in firstList['sizes'].keys():
timenow = datetime.now()
elapsed = timenow - value
if elapsed > timedelta(seconds=5):
restockSizes.append(f'{key}')
restocked = True
else:
restockSizes.append(f'{key}')
time.sleep(random.randint(1, 3))
if restocked:
print(f'Restocked: {restockSizes}')
firstList = secondList
else:
print("No restock.")
firstList = secondList
demo()
我不确定它是否确实按照我的描述工作。至于现在,我感到有些不清楚,是什么原因让我firstList = secondList
如果我必须在firstList和secondList之间进行比较,还不确定我是否也需要else statement
?
希望有人能看到这些缺陷并帮助我!
可以说我们的增量为分钟= 5
第一个请求:
美国3:22:23,美国4:22:23,美国5 22:23
第二个请求(第一次请求后1分钟):
US 3:22:23,US 4:22:23,US 5 22:23, US 6:22:24,US 8:22:24
第三次请求(第一次请求后5分钟):
美国3:22:28,美国4:22:28,美国5 22:28 ,美国6:22:24,美国8:22:24
第四次请求(第一次请求后6分钟):
US 3:22:28,US 4:22:28,US 5 22:28, US 6:22:29,US 8:22:29
答案 0 :(得分:1)
我认为这表明了您所寻找的一般想法:
from datetime import datetime, timedelta
import random
from typing import Dict, List
class RequestFilter:
"""Tracks requests and filters them to prevent hammering."""
def __init__(self, cooldown: timedelta):
self._cooldown = cooldown
self._requests: Dict[str, datetime] = {}
def filter(self, requests: List[str], time: datetime) -> List[str]:
"""Filter requests to only those that haven't been made
previously within our defined cooldown period."""
# Get filtered set of requests.
filtered = [
r for r in list(set(requests))
if (
r not in self._requests
or time - self._requests[r] >= self._cooldown
)
]
# Refresh timestamps for requests we're actually making.
for r in filtered:
self._requests[r] = time
return filtered
if __name__ == '__main__':
time = datetime.now()
request_filter = RequestFilter(timedelta(minutes=5))
for _ in range(100):
requests = [
f"US {random.randint(1, 10)}"
for _ in range(5)
]
print(request_filter.filter(requests, time), time)
time += timedelta(minutes=1)
请注意,我使过滤功能带有时间戳,而不是在内部实际使用datetime.now()
-这样,您可以使用伪造的时间戳对其进行单元测试,而不必修补datetime
或它实际上在假请求之间睡了一分钟。 :)
在现实生活中,您只需要说request_filter.filter(requests, datetime.now())
就可以实时使用它。或者,您可以将其用作__main__
函数:
if __name__ == '__main__':
from time import sleep
request_filter = RequestFilter(timedelta(minutes=5))
for _ in range(100):
requests = [
f"US {random.randint(1, 10)}"
for _ in range(5)
]
print(request_filter.filter(requests, datetime.now()), datetime.now())
sleep(60)