2017-05-06 9 views
2

contextは、コンストラクタの任意の引数です(class multiprocessing.pool.Pool)。 Documentationのみ:`multiprocessing.pool.Pool`の` context`引数の意味は何ですか?

contextワーカープロセスの開始に使用されるコンテキストを指定するために使用できます。通常、プールは、コンテキストオブジェクトのメソッドmultiprocessing.Pool()またはPool()メソッドを使用して作成されます。どちらの場合も、コンテキストは適切に設定されます。

それは、「コンテキストオブジェクト」はclass Poolコンストラクタは、それを必要とする理由、およびそれが言及したシナリオでは、「適切に設定されている」ことを意味するものであり、どのような明らかにしません。

答えて

1

プラットフォームに応じて、マルチプロセッシングはプロセスを開始する3つの方法をサポートします。これらの開始方法は、以下のとおりです。

  • 産卵は:

    親プロセスは、新鮮なPythonインタプリタのプロセスを開始します。
    UnixおよびWindowsで利用できます。 Windowsではデフォルトです。

  • フォーク:親プロセスがos.fork使用

    ()Pythonインタプリタをフォークします。 UNIXのみで利用できます。 Unixのデフォルトです。

  • プログラムが起動し、forkserver開始方法を選択は、サーバー・プロセスが開始される

    forkserver。その後、新しいプロセスが必要なときはいつでも、親プロセスはサーバーに接続し、新しいプロセスをフォークするように要求します。フォークサーバープロセスはシングルスレッドなので、os.fork()を使用することは安全です。不要なリソースは継承されません。

    Unixパイプ上でファイル記述子を渡すことをサポートするUnixプラットフォームで利用できます。


あなたがメインモジュールのif __name__ == '__main__'句でset_start_method()を使用して起動方法を選択します。たとえば、

import multiprocessing as mp 

def foo(q): 
    q.put('hello') 

if __name__ == '__main__': 
    mp.set_start_method('spawn') 
    q = mp.Queue() 
    p = mp.Process(target=foo, args=(q,)) 
    p.start() 
    print(q.get()) 
    p.join() 

また、get_context()を使用してコンテキストオブジェクトを取得することもできます。コンテキストオブジェクトは、マルチプロセッシングモジュールと同じAPIを持ち、同じプログラム内で複数の開始メソッドを使用できるようにします。

import multiprocessing as mp 

def foo(q): 
    q.put('hello') 

if __name__ == '__main__': 
    ctx = mp.get_context('spawn') 
    q = ctx.Queue() 
    p = ctx.Process(target=foo, args=(q,)) 
    p.start() 
    print(q.get()) 
    p.join() 

これは、コンテキストオブジェクトの出所です!

+0

コンテキストマネージャーに関するいくつかの無関係なマッチの後で、そのdocページで 'context'という単語を検索することを私が断念していない場合のみ:) – max

関連する問題