呼び出しをブロックするスレッドがいくつかあるPythonプログラムがあります。たとえば :いくつかのスレッドで呼び出しをブロックしているPython 2.7プログラムを停止する方法
#!/usr/bin/python
import threading, tty, sys, os, signal
# super-awesome thread launcher (re-inventing the wheel because I'm
# too lazy to research what they called this)
class Launch(threading.Thread):
def __init__(self, f):
threading.Thread.__init__(self)
self.f = f
self.start()
def run(self):
self.f()
# structure to hold unprocessed chars
Term_Lock = threading.Lock()
Term_Cond = threading.Condition(Term_Lock)
Term_In = []
# launch a thread to retrieve characters from the terminal
tty.setraw(sys.stdin.fileno())
@Launch
def Stdin_Reader():
while True:
c = sys.stdin.read(1)
with Term_Lock:
Term_In.append(c)
Term_Cond.notify()
# main thread
c = None
with Term_Lock:
Term_Cond.wait(1)
if Term_In:
c = Term_In.pop(0)
if c:
print "You pressed '%s'\r" % c
else:
print "You were too slow!\r"
# Lord have mercy on my soul
os.kill(os.getpid(), signal.SIGKILL)
このプログラムはうまく動作しますが、最後にそのos.kill()
は少し不安です。私は他の多くの言語でプログラミングしていますが、この種の問題は以前は見たことがありませんでした。私は、メインのスレッドの最後に_Exitコールを削除する言語の発明者に問題はありません。しかし、システムAPIから_Exitを完全に隠すには、今はそれが神経です。
実際、私たちが見ているのは、合理的な方法でプログラムを停止する方法に関する基本的な質問です。たとえば:
Exit a process while threads are sleeping
彼らは、Python 3.0デーモンスレッドを使用すると言います。 Python 3.0が最終的に一般的な2.7の互換性を導入したときには、そのことを念頭に置いておきます。
Is there any way to kill a Thread in Python?
が、最高の投票応答「といういたしません」基本的には次のとおりですので、次の最高のアイデアは、すべてのスレッドを停止することです。いいよ。だから上の私の例を取る。ブロックするコールはsys.stdin.read()
です。私たちはそれをどのように修正するのですか?彼らはselect()
を使用すると言う:
はしかし待って。選択はファイル記述子とタイムアウトでのみ機能します。データを生成するためにファイル記述子を使用していないプログラムやライブラリから他の入力を受けたい場合はどうすればよいですか?だから私はメモリ内のパイプや何かを作成する必要がありますか?これはばかばかしくなってきています。
したがって、Python 3.0が承認されるまで、os.kill()
を使用してください。
もっと良い方法がありますか?
ファイル記述子、パイプ、select()などを使用する場合は、ZeroMQを参照してください。 Actorモデルをダウンすると、zmqが大きな助けになることがあります。 – bazza