Python で小さなスレッド化の例を書きました。スレッド内で例外が発生すると、そのスレッドが実行され続け、終了しないという問題に直面しています。私は次のコードを持っています:
class Producer (threading.Thread):
def __init__(self, threadId):
threading.Thread.__init__(self)
self.threadId = threadId
self.killReceived = False
def produce(self):
while 1:
if self.killReceived == True:
print self.threadId+"inside kill section"
return False
print "running"
time.sleep(1)
raise Exception('boo')
def run(self):
try:
self.produce()
except Exception as e:
ThreadManager.getInstance().shutdown(self.threadId)
def stop(self):
self.killReceived = True
class ThreadManager:
_instance = None
@staticmethod
def getInstance():
if ThreadManager._instance == None:
ThreadManager._instance = ThreadManager()
return ThreadManager._instance
def __init__(self):
''' some initializations '''
def shutdown(self, threadId):
while threading.active_count() > 1:
for thread in threading.enumerate():
if type(thread) != threading._MainThread: #never kill main thread directly
thread.stop()
#print thread.threadId+" is alive? "+str(thread.isAlive())
プロデューサー内で例外を発生させると、キャッチされ、ThreadManager のシャットダウン メソッドを起動します。これにより、メイン スレッドを除くすべての実行中のスレッドの stop() メソッドが呼び出されます。コンシューマーはこの戦略を使用して終了しますが、プロデューサーはハングします。メソッドを実行isAlive
すると、プロデューサー スレッドがまだ実行されていることがわかりますが、実行メソッドは実行されていません。run() 内running
にあるメソッドから .As exception が出力されなくなったため、スレッドは自動的に終了するはずです。produce
しかし、そうではありません。では、プロデューサーはどこにいるのでしょうか?何らかの例外が発生したときに停止するにはどうすればよいですか?