1

在 Python 中,如果您使用多处理并且需要为函数提供额外的协议,您会怎么做?

例子:

if value == "Y":
    pool = multiprocessing.Pool(processes=8)
        pool.map(verify_headers, url_list)<-need to give parameter for a password
    pool.close()
    pool.join()
    print "Done..."

该功能将类似于:

def verify_headers(url, password):
    pass
4

3 回答 3

2

Pool.map接受一个参数的函数和一个迭代来产生该参数。我们可以通过将您的两个参数的函数包装在另一个函数体中来将其转换为一个参数的函数:

def verify_headers_with_passowrd(url):
    return verify_headers(url, 'secret_password')

并将其传递给pool.map

pool.map(verify_headers_with_password, url_list)

只要verify_headers可以password作为关键字参数,我们可以缩短一点:你可以使用functools.partial

pool.map(functools.partial(verify_headers, password='secret_password'), url_list)

编辑:正如Bakuriu指出的那样,multiprocessing通过酸洗传递数据,因此以下内容不起作用

pool.map(lambda url: verify_headers(url, 'secret_password'), url_list)

由于 lambda 是没有名称的函数,并且 pickle 按名称序列化函数。

于 2013-09-10T18:42:26.693 回答
1

i believe

from functools import partial

and

pool.map(partial(verify_headers,password=password),url_list)

should work?

edit: fixed based on recommendations below

于 2013-09-10T18:39:35.357 回答
0

您在原始函数之后定义一个函数,该函数接受一个 2 元素元组作为参数:

def verify_headers_tuple(url_passwd):
    return verify_headers(*url_passwd)

然后你可以zip用原来url_listitertools.repeat(password)

pool.map(verify_headers_tuple, it.izip(url_list, it.repeat(password)))

请注意,传递给的函数Pool.map 必须在模块的顶层定义(由于酸洗限制),这意味着您不能使用partiallambda创建“咖喱函数”。

于 2013-09-10T18:43:30.080 回答