Python 在池映射中使用列表/多个参数

新手上路,请多包涵

我正在尝试将列表作为参数传递给 pool.map(co_refresh, input_list) 。然而, pool.map 没有触发功能 co_refresh 。也没有返回错误。看起来这个过程挂在那里。

原始代码:

 from multiprocessing import Pool
import pandas as pd
import os

account='xxx'
password='xxx'
threads=5
co_links='file.csv'

input_list=[]

pool = Pool(processes=threads)
def co_refresh(url, account, password, outputfile):

    print(url + ' : ' + account + ' : ' + password + ' : ' + outputfile)

    return;

link_pool = pd.read_csv(co_links, skipinitialspace = True)

for i, row in link_pool.iterrows():

    ln = (row.URL, account, password, os.path.join('e:/', row.File_Name.split('.')[0] + '.csv'))

    input_list.append(ln)

pool.map(co_refresh, input_list)

pool.close()

但是,它从未触发函数 co_refresh 。如何使用列表作为传递给我的函数的参数?

旧问题(简化):

我有下面的 input_list,它是 listlist

 [a1, b1, c1, d1]
[a2, b2, c2, d2]
[a3, b3, c3, d3]

我有如下功能:

 def func(a, b, c, d)
   ###
    return;

我想为此功能使用多 func

 from multiprocessing import Pool
pool = Pool(processes=5)
pool.map(func, input_list)
pool.close()

但是,它从未触发函数 func 。如何使用列表作为传递给我的函数的参数?

原文由 lovechillcool 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 455
2 个回答

您应该在声明 Pool 之前 定义您的工作函数,当您声明 Pool 时, 子工作进程从该点分叉,工作进程不执行该行之外的代码,因此看不到你的工作职能。

此外,您最好将 pool.map 替换为 pool.starmap 以适合您的输入。

一个简化的例子:

 from multiprocessing import Pool

def co_refresh(a, b, c, d):
    print(a, b, c, d)

input_list = [f'a{i} b{i} c{i} d{i}'.split() for i in range(4)]
# [['a0', 'b0', 'c0', 'd0'], ['a1', 'b1', 'c1', 'd1'], ['a2', 'b2', 'c2', 'd2'], ['a3', 'b3', 'c3', 'd3']]

pool = Pool(processes=3)
pool.starmap(co_refresh, input_list)
pool.close()

原文由 georgexsh 发布,翻译遵循 CC BY-SA 3.0 许可协议

考虑下面的代码

from multiprocessing.pool import Pool

data = [["a1", "b1", "c1", "d1"],
        ["a2", "b2", "c2", "d2"],
        ["a3", "b3", "c3", "d3"], ]

def someaction(a, b=1, c=2, d=3):
    print(a, b, c, d)

当您使用池在脚本中调用它时

pool = Pool(4)
pool.map(someaction, data)

输出是

['a1', 'b1', 'c1', 'd1'] 1 2 3
['a2', 'b2', 'c2', 'd2'] 1 2 3
['a3', 'b3', 'c3', 'd3'] 1 2 3

所以 a 获取数组,其余所有参数均未传递。 Pool.map 期望函数只有一个参数。所以为了你的案例工作,你需要创建一个包装函数

def someaction_wrapper(data):
    someaction(*data)

然后在池中调用这个包装函数。现在你使用

pool = Pool(4)
pool.map(someaction_wrapper, data)

输出是

a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3

我相信这就是你想要的

原文由 Tarun Lalwani 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏