2

我是 Python 新手,我正在编写一个包含一些定时例程的脚本。我目前的方法是实例化一个包含这些定时器的类(来自:threading.Timer),但我不希望脚本在函数结束时返回:

import mytimer

timer = mytimer()

假设我有一个像那样的简单脚本。它所做的只是实例化一个执行一系列定时活动的 mytimer 对象。

为了使应用程序不退出,我可以像这样使用 Qt:

from PyQt4.QtCore import QCoreApplication
import mytimer
import sys

def main():
    app = QCoreApplication(sys.argv)
    timer = mytimer()

    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这样,sys.exit()调用不会立即返回,计时器只会在后台“永远”做它的事情。

虽然这是我以前使用过的解决方案,但仅仅为此使用 Qt 对我来说并不合适。所以我的问题是,有没有办法使用标准 Python 来完成这个任务?

谢谢

4

3 回答 3

1

Create a function in your script which tests a select or poll object to terminate a loop. Check out serve_forever in SocketServer.py from the standard library as an example.

于 2012-05-26T03:17:53.440 回答
0

谷歌搜索“python timer”发现:

http://docs.python.org/library/sched.html

http://docs.python.org/release/2.5.2/lib/timer-objects.html

sched模块似乎正是您所需要的。

例子:

>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(): print "From print_time", time.time()
...
>>> def print_some_times():
...     print time.time()
...     s.enter(5, 1, print_time, ())
...     s.enter(10, 1, print_time, ())
...     s.run()
...     print time.time()
...
>>> print_some_times()
930343690.257
From print_time 930343695.274
From print_time 930343700.273
930343700.276

一旦你建立了事情发生的时间队列,你只需.run()在你的实例上调用该方法sched,它会自动等到队列被清空,然后才会完成。因此,您可以将s.run()其作为脚本中的最后一件事,并且仅当定时任务全部完成时它才会自动退出。

于 2012-05-26T05:05:29.227 回答
0
import mytimer
import sys

from threading import Lock

lock = Lock()
lock.acquire() # put lock into locked state

def main():
    timer = mytimer()

    lock.acquire()  # blocks until someone calls lock.release()

if __name__ == '__main__':
    main()

如果你想要一个干净的出口,你可以在某个时候mytimer()打电话。lock.release()

于 2012-05-26T21:27:43.783 回答