2

私はPythonを初めて使用し、時限ルーチンを含むスクリプトを作成しています。私の現在のアプローチは、これらのタイマーを含むクラスをインスタンス化することです(from: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

ループを終了するためにselectまたはpollオブジェクトをテストする関数をスクリプトに作成します。例として、標準ライブラリからチェックserve_foreverインしてください。SocketServer.py

于 2012-05-26T03:17:53.440 に答える
0

「pythontimer」をGoogleで検索すると、次のことがわかります。

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 に答える