2017-08-19 7 views
1

呼び出しをブロックするスレッドがいくつかある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()を使用してください。

もっと良い方法がありますか?

+0

ファイル記述子、パイプ、select()などを使用する場合は、ZeroMQを参照してください。 Actorモデルをダウンすると、zmqが大きな助けになることがあります。 – bazza

答えて

0

私はos._exit(0)は私が欲しいものであることを考える:

What is difference between sys.exit(0) and os._exit(0)

完璧に動作するようです。私はそれを私自身のExit()機能に入れて、私が望むどんなクリーンアップをも行うことができます。

関連する問題