像geven中的cron(计时器)

Boj*_*vic 7 python timer gevent

如何在gevent中制作经典计时器?

我目前正在使用gevent.spawn_later,但有没有办法像使用cron那样使用core.timer来说"在间隔上做回调"?

def callback():
    # do something
    print '!'

timer = core.timer(10, callback)
timer.start()

outpout:
0s
10s  !
20s  !
30s  !
Run Code Online (Sandbox Code Playgroud)

Chi*_*ggs 15

这取决于您希望如何准确地安排工作.有几种机制:

这个博客有一个用于gevent.spawn_later创建计时器的巧妙技巧:

def schedule(delay, func, *args, **kw_args):
    gevent.spawn_later(0, func, *args, **kw_args)
    gevent.spawn_later(delay, schedule, delay, func, *args, **kw_args)
Run Code Online (Sandbox Code Playgroud)

或者当然,你可以简单地睡在一个可能更具可读性的循环中:

def run_regularly(self, function, interval, *args, **kwargs):
    while True:
        gevent.sleep(interval)
        function(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

然而,这些都会随着时间的推移而漂移,特别是如果你的功能相对于间隔需要时间来完成.您可以通过在执行函数时调整休眠间隔来进行补偿:

def run_regularly(self, function, interval, *args, **kwargs):
    while True:
        before = time.time()
        function(*args, **kwargs)

        duration = time.time() - before
        if duration < interval:
            gevent.sleep(interval-duration)
        else:
            warning("function %s duration exceeded %f interval (took %f)" % (
                function.__name__, interval, duration))
Run Code Online (Sandbox Code Playgroud)

这仍然会漂移,只是没那么多......


小智 8

在我的脑海中,您可以在循环中使用gevent.sleep:

import gevent
import gevent.monkey

gevent.monkey.patch_all()

INTERVAL = 10

def callback():
    # do something
    print "!"

def loop():
    while True:
        gevent.sleep(INTERVAL)
        callback()

gevent.Greenlet.spawn(loop)
Run Code Online (Sandbox Code Playgroud)

当然,您可以将此代码放在一个很好的API中,例如core.timer.但我会为你带来所有的乐趣:)