タグ付けされた質問 「multiprocessing」

マルチプロセッシングとは、単一のコンピューターシステム内で2つ以上の中央処理装置(CPU)を使用することです。関連する実装と使用法の詳細は、オペレーティングシステムとプログラミング言語によって異なります。したがって、このタグを使用するときは、常にOSと言語の両方のタグを追加してください。

5
マルチプロセッシングのために共有メモリでnumpy配列を使用する
マルチプロセッシングモジュールで使用するために、共有メモリでnumpy配列を使用したいと思います。問題は、それをctypes配列としてだけでなく、numpy配列のように使用することです。 from multiprocessing import Process, Array import scipy def f(a): a[0] = -a[0] if __name__ == '__main__': # Create the array N = int(10) unshared_arr = scipy.rand(N) arr = Array('d', unshared_arr) print "Originally, the first two elements of arr = %s"%(arr[:2]) # Create, start, and finish the child processes p …

6
Pythonマルチプロセッシングモジュールの.join()メソッドは正確には何をしているのですか?
Python Multiprocessingについて(PMOTWの記事から)学び、join()メソッドが正確に何をしているのかについての説明が必要です。 2008年の古いチュートリアルp.join()では、以下のコードの呼び出しがないと、「子プロセスはアイドル状態で終了せず、ゾンビになるため、手動で強制終了する必要がある」と述べています。 from multiprocessing import Process def say_hello(name='world'): print "Hello, %s" % name p = Process(target=say_hello) p.start() p.join() 私はプリントアウトの追加PIDだけでなくtime.sleep、自分自身で処理を終了するをテストし、私の知る限りを: from multiprocessing import Process import sys import time def say_hello(name='world'): print "Hello, %s" % name print 'Starting:', p.name, p.pid sys.stdout.flush() print 'Exiting :', p.name, p.pid sys.stdout.flush() time.sleep(20) p = Process(target=say_hello) …

8
マルチプロセッシング:プロセス間で大きな読み取り専用オブジェクトを共有していますか?
子プロセスは、プログラムの前半で作成されたマルチプロセッシング共有オブジェクトを介して生成されますか? 次の設定があります。 do_some_processing(filename): for line in file(filename): if line.split(',')[0] in big_lookup_object: # something here if __name__ == '__main__': big_lookup_object = marshal.load('file.bin') pool = Pool(processes=4) print pool.map(do_some_processing, glob.glob('*.data')) いくつかの大きなオブジェクトをメモリに読み込んで、その大きなオブジェクトを利用する必要があるワーカーのプールを作成しています。ビッグオブジェクトは読み取り専用でアクセスされます。プロセス間で変更を渡す必要はありません。 私の質問です:unix / cでプロセスを生成した場合と同じように、ビッグオブジェクトは共有メモリに読み込まれますか、それとも各プロセスがビッグオブジェクトの独自のコピーを読み込みますか? 更新:さらに明確にするために-big_lookup_objectは共有ルックアップオブジェクトです。分割して個別に処理する必要はありません。コピーを1つだけ保持する必要があります。分割する必要がある作業は、他の多くの大きなファイルを読み取り、それらの大きなファイル内のアイテムをルックアップオブジェクトに対して検索することです。 さらなる更新:データベースは優れたソリューションであり、memcachedはより優れたソリューションであり、ディスク上のファイル(シェルブまたはdbm)はさらに優れている可能性があります。この質問では、メモリ内ソリューションに特に興味がありました。最終的な解決策として、私はhadoopを使用しますが、ローカルのメモリ内バージョンも使用できるかどうかを確認したいと思いました。

4
Python 3でのマルチプロセッシングvsマルチスレッディングvs asyncio
Python 3.4では、マルチプロセッシング/スレッディング用のいくつかの異なるライブラリがあることを発見しました:マルチプロセッシング vs スレッディング vs asyncio。 しかし、どちらを使用するか、または「推奨されるもの」かわかりません。彼らは同じことをしますか、それとも異なりますか?もしそうなら、どれが何のために使用されますか?コンピューターでマルチコアを使用するプログラムを書きたいのですが。しかし、どのライブラリを学ぶべきかわかりません。

8
マルチプロセッシング:tqdmを使用して進行状況バーを表示する
私のコードをより「Pythonic」かつより高速にするために、「マルチプロセッシング」とマップ関数を使用して、a)関数とb)反復の範囲を送信します。 埋め込まれたソリューション(つまり、tqdm.tqdm(range(0、30)の範囲で直接tqdmを呼び出す)は、マルチプロセッシングでは機能しません(以下のコードで定式化)。 進行状況バーは0〜100%の範囲で表示されますが(Pythonがコードを読み取るときは?)、マップ関数の実際の進行状況は表示されません。 「マップ」機能がどのステップにあるかを示す進行状況バーを表示するにはどうすればよいですか? from multiprocessing import Pool import tqdm import time def _foo(my_number): square = my_number * my_number time.sleep(1) return square if __name__ == '__main__': p = Pool(2) r = p.map(_foo, tqdm.tqdm(range(0, 30))) p.close() p.join() ヘルプや提案は大歓迎です...

7
Pythonプロセスプールは非デーモンですか?
非デーモンであるPythonプールを作成することは可能ですか?内部に別のプールがある関数をプールが呼び出せるようにしたい。 デーモンプロセスはプロセスを作成できないため、これが必要です。具体的には、エラーが発生します。 AssertionError: daemonic processes are not allowed to have children たとえば、function_a実行するプールがある実行するプールがあるシナリオを考えてみfunction_bますfunction_c。function_bデーモンプロセスで実行されているため、この関数チェーンは失敗し、デーモンプロセスはプロセスを作成できません。

9
Pythonマルチプロセッシングプールのimap_unordered呼び出しの進行状況を表示しますか?
imap_unordered()呼び出しでマルチプロセッシングプールセットのタスクを正常に実行するスクリプトがあります。 p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work p.join() # Wait for completion しかし、私num_tasksは約250,000なので、join()メインスレッドが10秒ほどロックされます。メインプロセスがロックされていないことを示すために、コマンドラインに段階的にエコー出力できるようにしたいと考えています。何かのようなもの: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work while (True): remaining = rs.tasks_remaining() # How many of the map call haven't been done yet? if (remaining == …

6
Pythonでマルチプロセッシングキューを使用するにはどうすればよいですか?
マルチプロセッシングキューがPythonでどのように機能し、どのように実装するかを理解しようとすると、非常に苦労します。共有ファイルからデータにアクセスする2つのPythonモジュールがあるとしましょう。これらの2つのモジュールを、ライターとリーダーと呼びましょう。私の計画では、リーダーとライターの両方がリクエストを2つの別々のマルチプロセッシングキューに入れ、3番目のプロセスがこれらのリクエストをループでポップしてそのように実行するようにします。 私の主な問題は、multiprocessing.queueを正しく実装する方法が本当にわからないことです。プロセスごとにオブジェクトが個別のキューになるため、実際にインスタンス化することはできません。すべてのプロセスが共有キューに関連していることをどのように確認しますか(またはこの場合、キュー)

2
複数のプロセス間で結果キューを共有する
multiprocessingモジュールのドキュメントには、で始まるプロセスにキューを渡す方法が示されていますmultiprocessing.Process。しかし、どのようにして非同期ワーカープロセスでキューを共有できapply_asyncますか?動的な結合などは必要ありません。ワーカーが(繰り返し)結果をベースに報告する方法にすぎません。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) これは失敗します: RuntimeError: Queue objects should only be shared between processes through inheritance。私はこれが何を意味するのかを理解し、酸洗い/酸洗いを必要とするのではなく継承するためのアドバイス(およびWindowsのすべての特別な制限)を理解しています。しかし、機能するようにキューを渡すにはどうすればよいですか?私は例を見つけることができず、さまざまな方法で失敗した代替案をいくつか試しました。助けてください?

5
マルチプロセッシングキュー、プール、ロックを使用した非常に単純な例
http://docs.python.org/dev/library/multiprocessing.htmlにあるドキュメントを読み込もうとしましたが、まだマルチプロセッシングキュー、プール、ロックに苦労しています。そして今のところ、以下の例を構築することができました。 キューとプールについては、コンセプトが正しく理解されているかどうかわかりません。間違っている場合は修正してください。私が達成しようとしているのは、一度に2つのリクエストを処理することです(この例では、データリストには8つあります)。2つの異なるキュー(最大2つ)を処理できる2つのプロセスを作成するプール、またはQueueを使用して毎回2つの入力を処理する必要がありますか?ロックは、出力を正しく印刷することです。 import multiprocessing import time data = (['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'], ['e', '1'], ['f', '3'], ['g', '5'], ['h', '7'] ) def mp_handler(var1): for indata in var1: p = multiprocessing.Process(target=mp_worker, args=(indata[0], indata[1])) p.start() def mp_worker(inputs, the_time): print " Processs %s\tWaiting %s seconds" % (inputs, the_time) time.sleep(int(the_time)) …

1
グループ化されたパンダのDataFrameに効率的に関数を効率的に適用する
DataFrame(混合データ型の)非常に大きなグループに関数を適用する必要があることが多く、複数のコアを利用したいと考えています。 グループからイテレータを作成してマルチプロセッシングモジュールを使用できますが、すべてのグループと関数の結果をプロセス間のメッセージングのためにピクルする必要があるため、効率的ではありません。 酸洗いを回避する方法、またはDataFrame完全なコピーを回避する方法はありますか?マルチプロセッシングモジュールの共有メモリ機能はnumpy配列に限定されているようです。他のオプションはありますか?

6
マルチプロセッシングプロセス間で大規模な読み取り専用のNumpy配列を共有する
60GBのSciPyアレイ(マトリックス)があり、5つ以上のmultiprocessing Processオブジェクト間で共有する必要があります。私はnumpy-sharedmemを見て、SciPyリストでこの議論を読みました。2つのアプローチがあるようです-numpy-sharedmemとを使用してmultiprocessing.RawArray()NumPyをdtypesにマッピングしctypeます。さて、これnumpy-sharedmemが進むべき道のようですが、良い参考例はまだ見ていません。配列(実際には行列)は読み取り専用になるため、ロックは必要ありません。さて、サイズが大きいので、コピーは避けたいと思います。それはのように聞こえる正しい方法で作成することであるだけとして配列のコピーをsharedmem配列し、その後にそれを渡すProcessオブジェクト?いくつかの具体的な質問: sharedmemハンドルを実際にサブに渡すための最良の方法は何Process()ですか?1つの配列を渡すためだけにキューが必要ですか?パイプの方がいいでしょうか?Process()サブクラスのinit(pickle化されていると想定している)への引数として渡すことはできますか? 上でリンクしたディスカッションでnumpy-sharedmemは、64ビットセーフではないという言及がありますか?私は間違いなく32ビットアドレス指定できないいくつかの構造を使用しています。 このRawArray()アプローチにはトレードオフがありますか?遅い、バギー? numpy-sharedmemメソッドにctypeからdtypeへのマッピングが必要ですか? 誰かがこれを行ういくつかのオープンソースコードの例を持っていますか?私は非常に実践的な知識を持っており、良い例がなければ、これを機能させるのは困難です。 他の人にこれを明確にするために私が提供できる追加情報がある場合は、コメントしてください。追加します。ありがとう! これはUbuntuLinuxと多分MacOSで実行する必要がありますが、移植性は大きな問題ではありません。

4
Pythonのマルチプロセスで「AttributeError:__exit__」をトラブルシューティングする方法
Python 3.2.2の複数のコアで実行できるように、csvを読み取るコードを書き直そうとしました。Poolマルチプロセッシングのオブジェクトを使用しようとしましたが、これは実際の例から採用したものであり、プロジェクトの別の部分ですでに機能しています)。解読とトラブルシューティングが難しいエラーメッセージが表示されました。 エラー: Traceback (most recent call last): File "parser5_nodots_parallel.py", line 256, in <module> MG,ppl = csv2graph(r) File "parser5_nodots_parallel.py", line 245, in csv2graph node_chunks) File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 251, in map return self.map_async(func, iterable, chunksize).get() File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 552, in get raise self._value AttributeError: __exit__ 関連コード: import csv import time import …

9
Djangoマルチプロセッシングとデータベース接続
バックグラウンド: 私はPostgresデータベースでDjangoを使用するプロジェクトに取り組んでいます。私のWeb検索のいくつかがそれについて言及しているので、重要な場合に備えてmod_wsgiも使用しています。Webフォームの送信時に、Djangoビューはかなりの時間(ユーザーが待ちたいと思うよりも長い時間)かかるジョブを開始するため、バックグラウンドでシステムコールを介してジョブを開始します。現在実行中のジョブは、データベースの読み取りと書き込みができる必要があります。このジョブには非常に時間がかかるため、マルチプロセッシングを使用してその一部を並行して実行します。 問題: 最上位のスクリプトにはデータベース接続があり、子プロセスを生成すると、親の接続が子に利用可能であるように見えます。次に、クエリの前にSET TRANSACTION ISOLATIONLEVELを呼び出す方法について例外があります。調査によると、これは複数のプロセスで同じデータベース接続を使用しようとしたためです。私が見つけた1つのスレッドは、子プロセスの開始時にconnection.close()を呼び出すことを提案しました。これにより、Djangoは必要なときに新しい接続を自動的に作成するため、各子プロセスには一意の接続があります。つまり、共有されません。子プロセスでconnection.close()を呼び出すと、親プロセスが接続が失われたと文句を言うため、これは機能しませんでした。 その他の調査結果: 私が読んだいくつかのことは、あなたが実際にこれを行うことができないこと、そしてマルチプロセッシング、mod_wsgi、およびDjangoが一緒にうまく機能しないことを示しているようでした。それは私が推測することを信じるのは難しいようです。 長期的な解決策となる可能性のあるセロリの使用を提案する人もいましたが、承認プロセスが保留されているため、現時点ではセロリをインストールできません。 永続的なデータベース接続について、SOや他の場所でいくつかの参照が見つかりましたが、これは別の問題であると私は信じています。 また、psycopg2.poolとpgpoolへの参照、および用心棒に関する何かが見つかりました。確かに、私はそれらについて読んでいることのほとんどを理解していませんでしたが、それは確かに私が探していたものとして私に飛び出しませんでした。 現在の「回避策」: 今のところ、私は物事を連続して実行することに戻りました、そしてそれは動作しますが、私が望むより遅いです。 マルチプロセッシングを使用して並列実行する方法に関する提案はありますか?親と2人の子がすべてデータベースに独立して接続できるとしたら、問題はないようですが、その動作を取得できないようです。 ありがとう、そして長さをお詫びします!

5
Pythonマルチプロセッシングを使用した驚異的並列問題の解決
マルチプロセッシングを使用して、驚異的並列問題にどのように取り組むのですか? 驚異的並列問題は通常、次の3つの基本的な部分で構成されます。 入力データを読み取ります(ファイル、データベース、tcp接続などから)。 入力データに対して計算を実行します。各計算は他の計算から独立しています。 計算結果を(ファイル、データベース、tcp接続などに)書き込みます。 プログラムを2次元で並列化できます。 各計算は独立しているため、パート2は複数のコアで実行できます。処理の順序は関係ありません。 各パーツは独立して実行できます。パート1はデータを入力キューに配置し、パート2はデータを入力キューからプルして結果を出力キューに配置し、パート3は結果を出力キューからプルして出力することができます。 これは並行プログラミングの最も基本的なパターンのようですが、それを解決しようとするとまだ迷っています。そこで、マルチプロセッシングを使用してこれがどのように行われるかを示す標準的な例を書いてみましょう。 問題の例を次に示します。入力として整数の行を含むCSVファイルが与えられた場合、それらの合計を計算します。問題を3つの部分に分けます。これらはすべて、並行して実行できます。 入力ファイルを生データ(整数のリスト/反復可能ファイル)に処理します データの合計を並行して計算します 合計を出力します 以下は、これら3つのタスクを解決する従来の単一プロセスバインドPythonプログラムです。 #!/usr/bin/env python # -*- coding: UTF-8 -*- # basicsums.py """A program that reads integer values from a CSV file and writes out their sums to another CSV file. """ import csv import optparse import sys def …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.