python 周期性循环成语?

标签 python python-3.x

我有一个工作单元,我希望每 N 秒发生一次。如果我使用简单的

minute = 60
while True:
    doSomeWork()
    time.sleep(minute)

根据 doSomeWork() 需要多长时间,真正的循环周期将是一分钟加上该时间。如果 doSomeWork() 所花费的时间不是确定性的,那么工作的周期就更不可预测了。

我想做的是这样的

minute = 60
start = time.process_time() #? i can imagine using this, but maybe there's something better?
while True:
    doSomeWork()
    start += minute
    sleep_until(start) #? this is the function I'm in search of

(我使用的是 python 3.3)

更新:

在 Linux/OSX 上,我可以使用来自 signal 的定时器来完成我正在寻找的事情:

import signal
import datetime

def tick(_, __):
    # doSomeWork()
    print(datetime.datetime.now())

signal.setitimer(signal.ITIMER_REAL, 60, 60)
signal.signal(signal.SIGALRM, tick)

while True:
    signal.pause()

看起来正在为 python3.4 开发的郁金香也会使这很容易做到。

最佳答案

sleep_until(timestamp) 基本上是 time.sleep(timestamp - time.time())

您的代码实际上没问题(不过确保您不会让负时间进入休眠状态仍然是个好主意):

import time

minute = 60
next_time = time.time()
while True:
    doSomeWork()
    next_time += minute
    sleep_time = next_time - time.time()
    if sleep_time > 0:
        time.sleep(sleep_time)

我个人会制作一个 60 秒间隔时间戳的生成器并使用它:

import time
import itertools

minute = 60

for next_time in itertools.count(time.time() + minute, minute):
    doSomeWork()
    sleep_time = next_time - time.time()
    if sleep_time > 0:
        time.sleep(sleep_time)

关于python 周期性循环成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456166/

相关文章:

python - 基于两个 numpy 数组获取排序索引的最有效方法

python - Django 返回 http 早期刷新(分块响应)

django - 如何在 postgresql 或 mongodb 中使用 quandl Python API/模块存储来自 quandl 的数据集和数据库?

python-3.x - 怎么修?导入错误 : pycurl: libcurl link-time version is older than compile-time version

python - 从 PDF 中提取页眉/页脚(以编程方式)

python - 将多个表提取到 .csv

用于查找的 Python 正则表达式和用于从列表中删除的正则表达式

python - 正则表达式抓取电话号码

python - PyCharm 无法识别我的 Python 安装路径

Python 3 中的 Python 2 dict_items.sort()