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

标签 python python-multiprocessing python-pool

我正在尝试将列表作为参数传递给 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。如何使用列表作为传递给我的函数的参数?

最佳答案

在声明 Pool 时,您应该在 声明 Pool 之前定义工作函数,sub worker processes forked从那时起,工作进程不会执行超出该行的代码,因此看不到您的工作功能。

此外,您最好将 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()

关于Python 在池映射中使用列表/多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47424315/

相关文章:

python - Dropbox/delta 忽略光标

python - 如何更改 django admin css 样式和字体?

python - 将数据传递给 Python multiprocessing.Pool 工作进程

python - 如何处理 multiprocessing.Pool 中的初始化错误?

python - multiprocessing.Pool.map() 删除子类 ndarray 的属性

Python:AttributeError:无法腌制本地对象 'writeBuf.<locals>.write'

python - 安装 pybrain

python - 在 python 中读取并行 netCDF CDF-5 格式数据