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;