なぜこのコードはスレッドで動作しますが、プロセスでは機能しませんか?ProcessPoolExecutorに提出された呼び出し可能コードで未来/アクセス先を作成できないのはなぜですか?
デッドロックが発生しますキュータまたはProcessPoolExecutorに提出呼び出し可能な未来からメソッドを呼び出す:
import concurrent.futures as f import time def wait_on_b(): time.sleep(2) print(b.result()) return 5 def wait_5(): time.sleep(2) return 6 THREADS = False if THREADS: executor = f.ThreadPoolExecutor() else: executor = f.ProcessPoolExecutor() a = executor.submit(wait_on_b) b = executor.submit(wait_5) print(a.result()) # works fine if THREADS, BrokenProcessPool otherwise
docsは警告しません。
文書には例外が発生しているとは言えないので、ProcessPoolExecutor
は何とかデッドロックを発見し、両方のプロセスを強制終了して解決しましたか?
もっと重要なのは、このデッドロックはなぜプロセスで避けられないのか(そしてスレッドで避けられないのか)、未制限のまま複数のプロセスを使用する場合の回避策は何ですか?