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, который является list of list:

[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. Как я могу использовать список в качестве параметра передается в функцию?

3 ответов


вы должны определить свою рабочую функцию до об объявлении Pool, при объявлении Pool, sub рабочие процессы раздвоенные С этого момента рабочий процесс не выполняет код за пределами этой строки, поэтому не видит вашу рабочую функцию.

кроме того, вам лучше заменить 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()

рассмотрим приведенный ниже код

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)

и выход is

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

что вы хотели, я верю


ответ georgexsh отлично работает в Python 3; ключ в том, что starmap позволяет передавать в функцию несколько аргументов.

однако, если вы используете Python 2, вам нужно будет использовать классическую распаковку python, упомянутую в комментариях Ахмеда под вопросом здесь.

в моем случае, мне просто нужно "прикрепить" первый аргумент в функции.

def func(args)
   (a, b, c, d) = args
   # You can then use a, b, c, d in your function
    return;