2つのスレッドを実行する単純なアプリを作成する必要があります。-スレッド1:一定の期間で実行されます。たとえば、1分ごとに実行されます。
時間間隔で実行する必要がなければ、ツイストはまったく見ていなかったでしょうが、単純なsleep(60)は十分ではなく、次のような構造になっています。
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.run()
私がそこで望んでいたことを達成するために本当に簡単に見えました。
では、どうすれば「適切に」別のスレッドを追加できますか?
ここに2つのオプションがあります。
- スレッドライブラリを使用して、2つの「pythonスレッド」を実行します。1つはwhileループを実行し、もう1つはreactor.run()を実行します。しかし、Googleはこのアプローチに反対しているようで、ツイストスレッディングの使用を提案しています
- ツイストスレッドを使用します。それは私が試したことですが、どういうわけかこれは私には少し不器用に見えます。
これが私が思いついたものです:
def timed_thread():
print 'i will be called every 1 minute'
return
def normal_thread():
print 'this is a normal thread'
time.sleep(30)
return
l = task.LoopingCall(timed_thread)
l.start(60.0)
reactor.callInThread(normal_thread)
reactor.run()
それはうまくいくようですが!アプリを停止できません。^ Cを押すと、何も実行されません('callInThread'がないと、期待どおりに停止します)。^ Zがシェルに爆撃し、「kill%1」を実行すると、プロセスが強制終了するように見えます(シェルはそれを報告します)が、「通常の」スレッドは実行を続けます。kill PIDはそれを取り除くことはできず、唯一の治療法はkill-9です。本当に奇妙です。
それで。私は何が間違っているのですか?ツイストで2つのスレッドを実装するのは正しいアプローチですか?ねじれを気にしないでください。時限呼び出しを実装するための他の「標準」の代替手段は何ですか?(「標準」とは、easy_installまたはyum installを実行できることを意味します。ランダムなWebページからランダムなスクリプトをダウンロードして使用し始めたくありません)。