在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
答案 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)
然后,您可zip
原url_list
itertools.repeat(password)
:
pool.map(verify_headers_tuple, it.izip(url_list, it.repeat(password)))
请注意,传递给Pool.map
的函数必须在模块的顶层定义(由于酸洗限制),这意味着您无法使用partial
或{ {1}}创建“咖喱功能”。