私はUbuntu 16.04.2 LTSとPython 3.5.2を使用しています。 私はThreadPool
からmultiprocessing
まで仕事をしています。 今私は仕事をしている間にこのプールを終了したいと思います。Python 3:マルチプロセッシングでのスレッドの終了ThreadPoolが機能しない
ThreadPool.terminate()
を使用すると、期待どおりに機能しません。 次の例を実行すると、ワーカーは作業を停止することはなく、プログラムはThreadPool.join()
コールを超えて実行されることはありません。
import time
from multiprocessing.pool import ThreadPool
def task():
try:
while True:
print("Working")
time.sleep(1)
except: # Unsuccessful attempt. :(
print("Working, stopping now")
thread_pool = ThreadPool(processes=1)
thread_pool.apply_async(task)
time.sleep(1) # Make sure the task is actually started.
print("Terminating")
thread_pool.terminate()
print("Termination: Initiated")
thread_pool.join() # Does not return.
print("Termination: Done")
私は間違っていますか?
ありがとうございました。私はスレッドの代わりにプロセスを使用する実際のマルチプロセッシングの実装について知っていましたが、私のアプリケーションにスレッドを使用する必要があります。しかし、私は 'ThreadPool.terminate()'の実装が実際にはそうであることは知らなかった。私自身が終了通信機能を実装しなくても使える 'ThreadPool'の代替手段はありますか?タスクで例外をキャッチするようなことをしなければならないのはもちろんです。 – mxscho
Pythonが提供するレベルよりも低いレベルになると、特定のスレッドにシグナルを送ることができます。メカニズムは(明らかに)マシンに依存します。いくつかのシステム(確かにFreeBSD)のスレッドシグナルハンドリングには、あなたのPythonで回避策があるかもしれないさまざまなバグがあり、それがさらに干渉する可能性があるので、あなたのシステム上で動作することを実験する必要があります。これを行うための移植可能な方法は、共有する「停止する時間」を設定することです。タスク内で定期的にチェックしてください。 – torek