gpt4 book ai didi

python - Python 2.7 中有什么类似于 Go 的 `time.Tick` 或 Netty 的 `HashedWheelTimer` 吗?

转载 作者:IT王子 更新时间:2023-10-29 00:57:50 26 4
gpt4 key购买 nike

我写了很多依赖于精确周期性方法调用的代码。我一直在使用 Python 的 futures 库将调用提交到运行时的线程池,并在循环中的调用之间休眠:

executor = ThreadPoolExecutor(max_workers=cpu_count())

def remote_call():
# make a synchronous bunch of HTTP requests

def loop():
while True:
# do work here
executor.submit(remote_call)
time.sleep(60*5)

但是,我注意到此实现在长时间运行后引入了一些漂移(例如,我运行此代码大约 10 小时并注意到大约 7 秒的漂移)。对于我的工作,我需要它在精确的秒上运行,而毫秒会更好。有些人向我指出 asyncio ( "Fire and forget" python async/await ),但我无法在 Python 2.7 中使用它。

我不是在寻找黑客。我真正想要的是类似于 Go 的 time.Tick 或 Netty 的 HashedWheelTimer 的东西。

最佳答案

Python 没有这样的东西。您需要手动调整 sleep 时间以考虑工作时间。

你可以把它折叠成一个迭代器,很像 Go 的 time.Tick 的 channel :

import itertools
import time
import timeit

def tick(interval, initial_wait=False):
# time.perf_counter would probably be more appropriate on Python 3
start = timeit.default_timer()

if not initial_wait:
# yield immediately instead of sleeping
yield

for i in itertools.count(1):
time.sleep(start + i*interval - timeit.default_timer())
yield

for _ in tick(300):
# Will execute every 5 minutes, accounting for time spent in the loop body.
do_stuff()

请注意,上面的自动收报机在您开始迭代时开始计时,而不是在您调用 tick 时开始计时,如果您尝试启动自动收报机并将其保存以备后用,这很重要。此外,它不发送时间,如果接收器速度慢,它也不会丢弃滴答声。如果需要,您可以自行调整所有内容。

关于python - Python 2.7 中有什么类似于 Go 的 `time.Tick` 或 Netty 的 `HashedWheelTimer` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46941985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com