10

プールを使用してPythonでマルチプロセッシングパッケージを使用しようとしています。

map_async 関数によって呼び出される関数 f があります。

from multiprocessing import Pool

def f(host, x):
    print host
    print x

hosts = ['1.1.1.1', '2.2.2.2']
pool = Pool(processes=5)
pool.map_async(f,hosts,"test")
pool.close()
pool.join()

このコードには次のエラーがあります。

Traceback (most recent call last):
  File "pool-test.py", line 9, in <module>
    pool.map_async(f,hosts,"test")
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 290, in map_async
    result = MapResult(self._cache, chunksize, len(iterable), callback)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 557, in __init__
    self._number_left = length//chunksize + bool(length % chunksize)
TypeError: unsupported operand type(s) for //: 'int' and 'str'

f 関数に複数の引数を渡す方法がわかりません。何か方法はありますか?

4

3 に答える 3

6

Pool は Python 3 でコンテキスト マネージャーを返すため、with ステートメントを使用できます。これにより、例外の問題が回避され、閉じて参加する必要がなくなります。この場合、関数は常に x 変数の定数を受け取るため、これは部分評価で処理できます。map_async は遅延しているため、アクションを実行するために結果を取得する必要があります。map を使用することもできます。したがって:

from multiprocessing import Pool
from functools import partial

def f(host, x):
    print(host)
    print(x)

hosts = ('1.1.1.1', '2.2.2.2')
with Pool(processes=5) as pool:
    pool.map(partial(f, x='test'), hosts)

結果:

1.1.1.1
テスト
2.2.2.2
テスト
于 2015-05-17T12:44:21.027 に答える