2

Python でイベントをスケジュールする方法の簡単な例が見つからないようです。

日付と時刻の文字列を引数として関数に渡せるようにしたいと考えています。

例えば:

文字列: "m/d/Y HH:MM" は、コードが実行された後に、将来の関数が実行される時間を設定します。つまり、実行後にオフになるのを待っている関数のように。

主な問題は文字列を正しくフォーマットすることのようですが、単純な例は、実行する関数を「スケジュール」する方法を理解するのに本当に役立ちます。

4

1 に答える 1

2

より大きなフレームで何をしようとしているのかを理解するのに十分なコンテキストを提供しませんが、一般的に言えば、Python では「これは機能しません」。

「通常の」Python プログラムは、シングルスレッドの同期プログラムです。タスクが次々と実行され、すべてが完了すると、プログラムが終了し、インタープリターも一緒に終了します。

そのため、(架空の「スケジュール」機能を使用して)次のようなものがあります。

def main():
    print("Hello World")
    schedule(60, main)

main()

schedule の呼び出しがすぐに戻る場合、Python では機能しません。メイン関数が終了し、プログラムはmain()呼び出し後に再開を試みて終了します。プログラムを実行し続けるためには、時間と遅延をカウントし、おそらくネットワークまたはユーザーが生成したイベントを受信し、事前に準備されたコールバック関数にディスパッチできる、実行中のコードの一部が必要です。

時間とディスパッチ呼び出しを説明できるこのようなコードは、通常「リアクター」と呼ばれますが、プレーンな Python プログラムで実行されるものはありません。たとえば、ブラウザやその他の JavaScript 環境がデフォルトでそのようなホスティングを提供する JavaScript プログラムとは異なります。

mainloopこれが、ほとんどの Python Web またはネットワーク フレームワーク、すべての GUI ツールキットがそのようなコアを提供する理由です。これは通常、1 つのメインのスクリプトの最後で呼び出され、 orserve_foreverなどの名前のメソッドまたは関数startです。その時点から、適切なコールバック、スケジュールされたものなどを設定したメイン スクリプトが停止します。リアクタは、ものを呼び出すコードの一部になります。

ここで、あなたの質問はあなたがやりたいことの文脈を見逃していると言います.最初はスケジューリングをテストしたいだけですが、その後、より大きなシステム内でそれが必要になります.そのシステムは、あなたの「たとえば、Web サーバー システムの場合は Django、トルネード、ピラミッド、GUI プログラムの場合は gtk、Qt、Tk、マルチメディア プログラムの場合は PyOgre、kivy、pyglet などです。別のプロトコルの汎用ネットワーク サーバー、または celery や camaelia などの他のもの - これらは一般的な例にすぎません。

とは言うものの、Python の標準ライブラリは「一般的な」スケジューラ関数を提供しています。機能のコアのみを使用して、そのようなループを実装しています。他に何もせず、特別なことも何もしていない場合、スケジュールされた関数を呼び出す時間に達するまでブロックされ、その時点で終了し、メインプログラムへの制御が再開されます。呼び出された関数が他のことをスケジュールしている場合は、引き続き実行されます。

次のドキュメントと例を参照してください: http://docs.python.org/2/library/sched.html

time.time の代わりに datetime モジュールの関数を使用して、必要に応じて r 絶対タイミングを設定できます。また、そこにあるドキュメントを threading.Timer に確認してください。単純な方法で、特定の遅延の後に単純な関数を実行したい場合、実行中の他のコードと並行して、考えていることを多かれ少なかれ行うことができます。アプリケーションをイベントベースに書き直したくない - しかし、簡単にわかるかもしれませんが、大規模なシステムでは多くの欠点があります - リストされたフレームワークの 1 つを選択する必要があります。

于 2013-03-24T11:13:04.667 に答える