0

2 つの Python スレッドを実行しています ( import threading)。どちらもopen()通話でブロックされています。実際、彼らは名前付きパイプを開いて書き込みをしようとするため、誰かが名前付きパイプから読み込もうとするまでブロックするのが通常の動作です。

要するに、次のようになります。

import threading

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

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

^C を入力するopen()と、メイン スレッドが中断されます ( IOErrorerrno == 4 で発生します)。

私の問題は次のとおりです。tスレッドはまだ待機しており、割り込み動作を伝播させて、それも発生させたいと考えていIOErrorます。

4

1 に答える 1

0

Python ドキュメントでこれを見つけました:
" ... メイン スレッドのみが新しいシグナル ハンドラーを設定でき、シグナルを受信するのはメイン スレッドだけです (これは、基になるスレッドの実装であっても、Python シグナル モジュールによって強制されます)。個々のスレッドへのシグナルの送信をサポートしています。これは、スレッド間通信の手段としてシグナルを使用できないことを意味します。代わりにロックを使用し
ください。」

ライブラリ/信号.html

もう 1 つのアイデアは、select を使用して、スレッド内で非同期にパイプを読み取ることです。これは Linux で動作しますが、Windows については不明です (最もクリーンでも最適な実装でもありません)。

   #!/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
于 2012-04-11T09:03:31.253 に答える