Python多处理,需要额外的论据

时间:2013-09-10 18:27:43

标签: python arguments multiprocessing

在Python中,如果您使用多处理并且需要为该功能提供额外的agruement,您会怎么做?

示例:

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

3 个答案:

答案 0 :(得分:2)

Pool.map采用一个参数和一个iterable的函数来生成该参数。我们可以将两个参数的函数转换为一个参数的函数,方法是将它包装在另一个函数体中:

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通过pickle传递数据,因此以下不会工作:

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

因为lambda是没有名字的函数,而pickle按名称序列化函数。

答案 1 :(得分:1)

我相信

from functools import partial

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

应该有用吗?

编辑:根据以下建议修复

答案 2 :(得分:0)

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

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

然后,您可zipurl_list itertools.repeat(password)

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

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