concurrent.futures.ProcessPoolExecutor.map()
能够调用由2个或更多参数组成的函数。在下面的示例中,我使用了一个lambda
函数,并将ref
定义为与numberlist
大小相等且具有相同值的数组。
第一个问题:是否有更好的方法?当numberlist的大小可能为百万到十亿个元素时,因此ref的大小必须跟随numberlist,这种方法会不必要地占用宝贵的内存,我希望避免这种情况。我之所以这样做是因为我读到map
函数将终止其映射,直到达到最短数组的末尾。import concurrent.futures as cf
nmax = 10
numberlist = range(nmax)
ref = [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
workers = 3
def _findmatch(listnumber, ref):
print('def _findmatch(listnumber, ref):')
x=''
listnumber=str(listnumber)
ref = str(ref)
print('listnumber = {0} and ref = {1}'.format(listnumber, ref))
if ref in listnumber:
x = listnumber
print('x = {0}'.format(x))
return x
a = map(lambda x, y: _findmatch(x, y), numberlist, ref)
for n in a:
print(n)
if str(ref[0]) in n:
print('match')
with cf.ProcessPoolExecutor(max_workers=workers) as executor:
#for n in executor.map(_findmatch, numberlist):
for n in executor.map(lambda x, y: _findmatch(x, ref), numberlist, ref):
print(type(n))
print(n)
if str(ref[0]) in n:
print('match')
运行上述代码后,我发现map
函数能够实现我想要的结果。然而,当我将相同的术语转移到concurrent.futures.ProcessPoolExecutor.map()时,Python3.5出现了以下错误:
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/queues.py", line 241, in _feed
obj = ForkingPickler.dumps(obj)
File "/usr/lib/python3.5/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x7fd2a14db0d0>: attribute lookup <lambda> on __main__ failed
问题2:为什么会出现这个错误,如何让concurrent.futures.ProcessPoolExecutor.map()调用一个带有多个参数的函数?
lambda
是因为最初当ref
是常量时,我无法将带有2个参数的函数传递到executor
中。 将ref
转换为与numberlist
相同大小的列表后,我突然意识到我忘记删除lambda
。 我真正想要的解决方案是ref
像常量或类似的东西一样。 所以你提到的辅助函数和itertools.repeat
很管用。谢谢。 - Sun BearExecutor.map
和Executor.submit
的性能进行了基准测试,发现前者明显较慢,我想知道原因是什么? - Sun Bear