Как передать несколько параметров в функцию, которая повторяется executor.map () из concurrent.futures.ProcessPoolExecutor - PullRequest
0 голосов
/ 31 января 2020

Эта проблема была опубликована несколько раз здесь в stackoverflow, но ни один из них не мог помочь мне, поскольку мой случай очень конкретен c.

У меня есть функция Myfunction (p1, p2, p3, p4) для выполнения которого требуется 4 параметра.

Мне нужно запустить Myfunction многопроцессорным способом.

Я использую concurrent.futures.ProcessPoolExecutor для выполнения этой работы.

Я знаю, как передать список в качестве аргумента в файле executor.map (Myfunction, arguments)

Но на этот раз у меня есть список кортежей, который представляет собой список из 4 моих аргументов для моей многопроцессорной обработки.

Вот мой код:

def Myfunction(p_udid,p_systemPort,p_deviceName, p_version, p_os):
    desired_caps = {}
    desired_caps['platformName'] = p_os
    desired_caps['platformVersion'] = p_version
    desired_caps['deviceName'] = p_deviceName
    desired_caps['udid'] = p_udid
    desired_caps['noReset'] = 'true'



if __name__ == '__main__':
    list=[('41492968379078','4730','S6S5IN3G','6','Android'),('53519716736397','4731','S6S5IN3G','6','Android'),('0123456789ABCDEF','4732','20','7','Android')]
    with concurrent.futures.ProcessPoolExecutor() as executor:
        multiprocesses = executor.map(Myfunction, list)

Конечно, я получаю ошибку:

concurrent.futures.process._RemoteTraceback: "" "Traceback (большинство последний вызов последнего): файл "C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ concurrent \ futures \ process.py", строка 239, в _process_worker r = call_item.fn (* call_item .args, ** call_item.kwargs) Файл "C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ conc urrent \ futures \ process.py ", строка 198, в _process_chunk возвращает [fn (* args) для аргументов в чанке] Файл" C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ concurrent \ futures \ process.py ", строка 198, взамен [fn (* args) для аргументов в чанке] TypeError: Myfunction () отсутствует 4 обязательных позиционных аргумента: 'p_systemPort', 'p_deviceName', 'p_version' и 'p_os '"" "

Вышеуказанное исключение было прямой причиной следующего исключения:

Traceback (последний вызов был последним): файл" E: / DropboxBACKUP14112018 / Cff / Python / project_GITHUB / test2 .py ", строка 24, для многопроцессных в многопроцессных: файл" C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ concurrent \ futures \ process.py ", строка 483, в _chain_from_iterable_of_lists для элемента в итерируемом: файл "C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ concurrent \ futures_base.py", строка 598, в result_iterator возвращает fs.pop (). result () Файл "C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ co ncurrent \ futures_base.py ", строка 435, в результате возвращает self .__ get_result () Файл" C: \ Users \ Nino \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ concurrent \ futures_base.py ", строка 384 , в __get_result поднять self._exception TypeError: Myfunction () отсутствует 4 обязательных позиционных аргумента: 'p_systemPort', 'p_deviceName', 'p_version' и 'p_os

Я пробовал разные вещи из всех ответов похоже на мою проблему, но у меня ничего не получилось.

Может кто-нибудь мне помочь, пожалуйста?

1 Ответ

1 голос
/ 31 января 2020

Вот как вы можете заставить его работать:

def Myfunction(*args):

    p_udid,p_systemPort,p_deviceName, p_version, p_os = args[0]

    desired_caps = {}
    desired_caps['platformName'] = p_os
    desired_caps['platformVersion'] = p_version
    desired_caps['deviceName'] = p_deviceName
    desired_caps['udid'] = p_udid
    desired_caps['noReset'] = 'true'
    return desired_caps

def cpu_tasks(func, *args):

    # set chunksize to be even 
    with ProcessPoolExecutor() as tp:
        result = tp.map(func, chunksize=10, *args)
    return list(result)

if __name__ == '__main__':
    lst=[('41492968379078','4730','S6S5IN3G','6','Android'),('53519716736397','4731','S6S5IN3G','6','Android'),('0123456789ABCDEF','4732','20','7','Android')]
    ans = cpu_tasks(Myfunction, *[lst])

    print(ans)

[{'platformName': 'Android',
  'platformVersion': '6',
  'deviceName': 'S6S5IN3G',
  'udid': '41492968379078',
  'noReset': 'true'},
 {'platformName': 'Android',
  'platformVersion': '6',
  'deviceName': 'S6S5IN3G',
  'udid': '53519716736397',
  'noReset': 'true'},
 {'platformName': 'Android',
  'platformVersion': '7',
  'deviceName': '20',
  'udid': '0123456789ABCDEF',
  'noReset': 'true'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...