0

私は2つのpythonスレッド(import threading)を実行しています。どちらもopen()コールでブロックされています。実際には名前付きパイプを書き込むために名前付きパイプを開こうとするので、誰かが名前付きパイプからの読み取りを試みるまでブロックするのは正常な動作です。要するにスレッドでシステムコールの中断を伝える

、それは次のようになります。私は^ Cを入力すると

import threading 

def f(): 
    open('pipe2', 'r') 

if __name__ == '__main__': 
    t = threading.Thread(target=f) 
    t.start() 
    open('pipe1', 'r') 

、メインスレッド内open()は(のerrno == 4とIOErrorを上げる)中断されます。

私の問題は:tスレッドがまだ待っている、私はそれを高めるために割り込み動作を伝播したいと思いますIOError

+0

それを起動する前に子スレッドでdaemon = Trueを設定した場合、どうなるでしょうか?Windowsではこれが正常ではありません。 –

+0

これ以上はありません。そして、私の質問の目的はスレッドを殺すことではなく、信号を受信した後に彼にいくつかのもの(掃除)をしてもらいたいのです。 – deathiop

答えて

0

私は、Pythonのドキュメントでこれを見つけた:
は「 ...のみ、メインスレッドが新しいシグナルハンドラを設定することができ、メインスレッドが信号を受信するための唯一のいずれかになります(これはPythonのシグナルモジュールによって実施されます "
多分、これらの文書もチェックしてください:
このスレッドに返信します...返信このスレッドに返信するスレッド一覧へスレッド一覧へスレッド一覧へスレッド一覧へ exceptions.KeyboardInterrupt

もう1つの考え方は、selectを使用してスレッド内でパイプを非同期で読み取ることです。

#!/usr/bin/python 

    import threading 
    import os 
    import select 

    def f(): 
      f = os.fdopen(os.open('pipe2', os.O_RDONLY|os.O_NONBLOCK)) 
      finput = [ f ] 
      foutput = [] 
      # here the pipe is scanned and whatever gets in will be printed out 
      # ...as long as 'getout' is False 
      while finput and not getout: 
        fread, fwrite, fexcep = select.select(finput, foutput, finput) 
        for q in fread: 
          if q in finput: 
            s = q.read() 
            if len(s) > 0: 
              print s 

    if __name__ == '__main__': 
      getout = False 
      t = threading.Thread(target=f) 
      t.start() 
      try: 
        open('pipe1', 'r') 
      except: 
        getout = True 
関連する問題