Python - 具有两个参数的多处理 StarMap
Python - Multiprocessing StarMap with two arguments
我有一个函数 运行 可以并行查询多个查询,但是我在 运行 我的函数使用 multiprocessing 时遇到了一些麻烦。我有这个代码:
def run(args):
query, cursor = args
cursor.execute(query)
with multiprocessing.Pool(processes=10) as pool:
args = (product(queries),cursor)
results = pool.starmap(run(args))
如果我 运行 只有 pool.starmap(run(product(queries)))
它工作得很好,但是我还需要传递光标对象。
我该怎么做?
我遇到以下错误:
TypeError: starmap() missing 1 required positional argument: 'iterable'
pool.starmap
接受两个参数:函数和参数列表。
来自文档:
pool.starmap(func, [(1,2), (3, 4)])
# results in [func(1,2), func(3,4)]
# I guess in your case would be
pool.starmap(run, [ product(queries), cursor ])
您的代码存在一些问题:
- 你用参数调用
run
,然后将结果传递给starmap
,但你必须将函数及其参数分别传递给starmap
- 你的参数是一个元组,首先是所有查询的乘积,然后是游标,但你更愿意将这些查询组合中的每一个与游标组合起来
- 您的函数需要一个参数,然后您可以在函数内部解压该参数,因此您应该使用
map
; starmap
应该是 def run(query, cursor)
试试这个:
import multiprocessing
import itertools
def run(args):
query, cursor = args
print("running", query, cursor)
queries = ["foo", "bar", "blub"]
cursor = "whatever"
with multiprocessing.Pool(processes=10) as pool:
args = ((args, cursor) for args in itertools.product(queries))
results = pool.map(run, args)
可能会有更多“上游”错误,例如 SSLSocket
的东西,但这至少应该(尝试)使用正确的参数调用函数。
我有一个函数 运行 可以并行查询多个查询,但是我在 运行 我的函数使用 multiprocessing 时遇到了一些麻烦。我有这个代码:
def run(args):
query, cursor = args
cursor.execute(query)
with multiprocessing.Pool(processes=10) as pool:
args = (product(queries),cursor)
results = pool.starmap(run(args))
如果我 运行 只有 pool.starmap(run(product(queries)))
它工作得很好,但是我还需要传递光标对象。
我该怎么做?
我遇到以下错误:
TypeError: starmap() missing 1 required positional argument: 'iterable'
pool.starmap
接受两个参数:函数和参数列表。
来自文档:
pool.starmap(func, [(1,2), (3, 4)])
# results in [func(1,2), func(3,4)]
# I guess in your case would be
pool.starmap(run, [ product(queries), cursor ])
您的代码存在一些问题:
- 你用参数调用
run
,然后将结果传递给starmap
,但你必须将函数及其参数分别传递给starmap
- 你的参数是一个元组,首先是所有查询的乘积,然后是游标,但你更愿意将这些查询组合中的每一个与游标组合起来
- 您的函数需要一个参数,然后您可以在函数内部解压该参数,因此您应该使用
map
;starmap
应该是def run(query, cursor)
试试这个:
import multiprocessing
import itertools
def run(args):
query, cursor = args
print("running", query, cursor)
queries = ["foo", "bar", "blub"]
cursor = "whatever"
with multiprocessing.Pool(processes=10) as pool:
args = ((args, cursor) for args in itertools.product(queries))
results = pool.map(run, args)
可能会有更多“上游”错误,例如 SSLSocket
的东西,但这至少应该(尝试)使用正确的参数调用函数。