Python-具有两个参数的多处理星图
我有一个并行运行多个查询的函数,但在使用多个参数的multprocessing运行函数时遇到了一些问题。我有以下代码:Python-具有两个参数的多处理星图,python,multiprocessing,iterable,starmap,Python,Multiprocessing,Iterable,Starmap,我有一个并行运行多个查询的函数,但在使用多个参数的multprocessing运行函数时遇到了一些问题。我有以下代码: 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))
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(运行(产品(查询))
它工作得很好,但是我还需要传递游标对象
我怎么能做到
我有以下错误:
TypeError: starmap() missing 1 required positional argument: 'iterable'
接受两个参数:函数和参数列表
从文档中:
pool.starmap(func,[(1,2)、(3,4)])
#[func(1,2),func(3,4)]
#我想在你的情况下
starmap(运行,[产品(查询),游标])
您的代码存在一些问题:
- 使用参数调用
,然后将结果传递给run
,但必须将函数及其参数分别传递给starmap
starmap
- 您的参数是一个元组,首先是所有查询的乘积,然后是游标,但您更希望将这些查询组合中的每一个与游标组合在一起
- 函数需要一个参数,然后在函数内部解包,因此应该使用
;对于map
它应该是starmap
def run(查询,光标)
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
之类的错误,但这至少应该(尝试)使用正确的参数调用函数。您的意思是starmap(run,args)
?执行pool.starmap(run(product(querys))
时,只需使用参数执行run
,然后将该函数的结果None
传递给`starmap.If我运行starmap(run,args)我得到了TypeError:无法pickle'SSLSocket'对象只是为了弄清楚这一点:您希望使用itertools.product(querys)
(无论查询是什么)中的每个不同组合执行run
,并且每个组合都具有相同的光标,对吗?是的,我想用同一个cursorI-get'TypeError:cannot pickle'SSLSocket'object'并行执行多个查询,代码如下:(不能在线程之间共享不可拾取的对象(如套接字)但是您可以传递有关如何复制或共享它们的详细信息。如果您可以在run
方法中实例化SSLSocket
,您也可以看到更多详细信息