Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-具有两个参数的多处理星图_Python_Multiprocessing_Iterable_Starmap - Fatal编程技术网

Python-具有两个参数的多处理星图

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))

我有一个并行运行多个查询的函数,但在使用多个参数的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))
如果我只运行
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
,您也可以看到更多详细信息