78

マルチプロセス プール オブジェクトを使用しようとしています。各プロセスが開始時にデータベース接続を開き、その接続を使用して、渡されたデータを処理したいと思います。(データのビットごとに接続を開いたり閉じたりするのではなく)。 for、しかし、ワーカーとイニシャライザーがどのように通信するかについて頭を悩ませることはできません。だから私はこのようなものを持っています:

def get_cursor():
  return psycopg2.connect(...).cursor()

def process_data(data):
   # here I'd like to have the cursor so that I can do things with the data

if __name__ == "__main__":
  pool = Pool(initializer=get_cursor, initargs=())
  pool.map(process_data, get_some_data_iterator())

get_cursor() から process_data() にカーソルを戻すにはどうすればよいですか (またはどうすればよいですか)?

4

5 に答える 5

109

初期化関数は次のように呼び出されます。

def worker(...):
    ...
    if initializer is not None:
        initializer(*args)

そのため、戻り値はどこにも保存されません。これは運命だと思うかもしれませんが、違います!各ワーカーは個別のプロセスにあります。したがって、通常のglobal変数を使用できます。

これは正確にはきれいではありませんが、機能します:

cursor = None
def set_global_cursor(...):
    global cursor
    cursor = ...

cursorこれで、関数で使用できますprocess_data。それぞれの個別のプロセス内のcursor変数は、他のすべてのプロセスから分離されているため、互いに踏み込むことはありません。

(そもそもpsycopg2使用を伴わない、これに対処する別の方法があるかどうかはわかりませんmultiprocessing。これは、モジュールの一般的な問題に対する一般的な回答として意図されていmultiprocessingます。)

于 2012-04-12T06:10:29.700 に答える