1

なぜこのコードはスレッドで動作しますが、プロセスでは機能しませんか?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は何とかデッドロックを発見し、両方のプロセスを強制終了して解決しましたか?

もっと重要なのは、このデッドロックはなぜプロセスで避けられないのか(そしてスレッドで避けられないのか)、未制限のまま複数のプロセスを使用する場合の回避策は何ですか?

答えて

1

スレッドを使用する場合メモリは、すべてのスレッド間を共有しているとwait_on_bBにアクセスできる理由です。

プロセスを使用して、新しいメモリ空間は、各プロセス(フォークモードで古いもののコピー)のために作成されるので、それはではありませんので、あなたが壊れたPIPEでBのコピーを取得します本当のB(単なるコピー)

はところで:窓に何フォークはありませんので、Bは、(メモリが全く新しいものである)が存在していないとあなたが

を取得します
concurrent.futures.process._RemoteTraceback: 
    """ 
    Traceback (most recent call last): 
     File "C:\Anaconda3\lib\concurrent\futures\process.py", line 175, in _process_worker 
     r = call_item.fn(*call_item.args, **call_item.kwargs) 
     File "C:\Users\yglazner\My Documents\LiClipse Workspace\anaconda_stuff\mproc.py", line 5, in wait_on_b 
     print(b.result()) 
    NameError: name 'b' is not defined 
    """ 
関連する問題