ホームページ >バックエンド開発 >Python チュートリアル >Python に基づいてマルチプロセス共有変数を開く正しい方法

Python に基づいてマルチプロセス共有変数を開く正しい方法

不言
不言オリジナル
2018-04-28 15:55:292938ブラウズ

次の記事では、Python に基づいてマルチプロセスのシェア変数を開く正しい方法を紹介します。これは参考になるので、皆さんのお役に立てれば幸いです。一緒に見てみましょう

複数のプロセスが変数を共有して結果を取得します

エンジニアリング要件により、プログラムを実行するには複数のスレッドを使用する必要があります。しかし、Python のマルチスレッドは偽物だと聞いたので、とにかくタスクが共有する必要があるパラメータを減らしてマルチプロセスを使用しました。

情報を調べたところ、マルチプロセッシングは主にマルチプロセスを実装するために使用され、プロセスとプールの 2 つの方法があることがわかりました。


p = Process(target=fun,args=(args))


次に、p.start() を使用して子プロセスを開始し、p.join() メソッドを使用して、親プロセスを実行する前に子プロセスの実行を終了させます。

しかし、これは非常に面倒で、n 個のスレッドを開いて参加するには for ループを作成する必要があります。

そこで、Pool を使用することをお勧めします。固定サイズのプロセス プールを開くことができ、各スレッドは apply_async() 関数を実行して実行する関数を呼び出し、最後に閉じて結合します。

コードは次のとおりです:


pathm=Manager().Queue(len(pathlist))
for d in pathlist:
 pathm.put(d)
p=Pool(cp.threads)
results=[]
for i in range(cp.threads):
 temp=p.apply_async(ProcessWorker,args=(i,pathm,cp))
 results.append(temp)
print 'Waiting for all subprocesses done...'
p.close()
p.join()
print 'All subprocesses finish Processing.'
results=[r.get() for r in results]


上記のコードは、プールマルチプロセスの使用方法、プール内のプロセス間で変数パスを共有する方法、およびプロセス関数の実行結果。 ProcessWorker は無制限の関数である必要があることに注意してください。そうでない場合は、関数をピクル化できず、各プロセスに割り当てることができないというエラーが報告されます。


cPickle.PicklingError: Can&#39;t pickle <type &#39;instancemethod&#39;>: attribute lookup __builtin__.instancemethod failed


有界関数とPythonのマルチプロセス機構

上記から派生した概念が、有界関数と非有界関数の概念です。

情報を検討した結果、次のように結論付けました:

制限付き関数は、クラスにパッケージ化され、クラスがインスタンス化されるときにのみ使用できる関数です。これらの関数をクラス メソッドと呼ぶことがよくあります。たとえば、self をパラメータとして受け取るクラス メソッドです。

無制限関数は、クラスにラップされていない関数であることも、クラスから独立した静的メソッドであることもあります。たとえば、クラス内の静的メソッドは、クラス内で定義されている場合でも、クラス内のパラメーターや他のメソッドにアクセスできません。

Python のマルチプロセス メカニズムでは、各プロセスによって呼び出されるメソッドと渡されるパラメーター (上記の例の ProcessWorker など) をコンパイルしてパッケージ化し、実行のために各プロセスにコピーする必要があります。入力が有界関数の場合、そのパラメーターはその関数が属するクラス (パラメーターとメソッドを含む) である必要がありますが、これは取得できず、クラス属性とメソッドには落とし穴がある可能性があるため、パッケージ化が困難になります。したがって、Python では、複数のプロセスから呼び出される関数をクラスメソッドにすることはできないと制限しています。

複数のプロセスから呼び出される関数をクラスの外に置くか、静的関数に変える必要があります。ただし、静的関数は、その関数が属するクラスのメソッド (self.ProcessWorker の形式) から呼び出すことはできません。mc=MyClass()、mc.ProcessWorker、または MyClass() など、外部から呼び出す必要があります。プロセスワーカー。

関連する推奨事項:

Python デコレータに基づいてクラスを装飾する方法

Python に基づいた配列と行列の詳細な説明 Numpy_python


以上がPython に基づいてマルチプロセス共有変数を開く正しい方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。