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

lov*_*ool 8 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()
Run Code Online (Sandbox Code Playgroud)

但是,它从未触发过该功能co_refresh.如何将列表作为参数传递给我的函数?

旧问题(简体):

我有以下input_list,这是一个listlist:

[a1, b1, c1, d1]
[a2, b2, c2, d2]
[a3, b3, c3, d3]
Run Code Online (Sandbox Code Playgroud)

我有如下功能:

def func(a, b, c, d)
   ###
    return;
Run Code Online (Sandbox Code Playgroud)

我想使用multiprocess来实现这个功能func:

from multiprocessing import Pool
pool = Pool(processes=5)
pool.map(func, input_list)
pool.close()
Run Code Online (Sandbox Code Playgroud)

但是,它从未触发过该功能func.如何将列表作为参数传递给我的函数?

geo*_*xsh 11

你应该定义你的功函数之前宣布的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()
Run Code Online (Sandbox Code Playgroud)