如何將多個參數傳遞給一個函數,該函數由conCurent.futures.ProcessPoolExecutor中的ecutor.map()迭代

更新時間:2024-04-02 12:07:24

問題闡述

此問題在Stackoverflow中發布了幾次,但沒有一個對我有幫助,因為我的案例非常具體。

我有一個函數MyFunction(p1,p2,p3,p4),它需要4個參數才能運行。

我需要以多處理方式運行MyFunction。

我使用concurrent.futures.ProcessPoolExecutor來完成此工作。

我知道如何在Executor.map(MyFunction,Argument)中將列表作為參數傳遞

但這一次,我有一個元組列表,這是我的多處理的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:"回溯(大多數最近一次呼叫):文件 "C:UsersNinoAppDataLocalProgramsPythonPython37libconcurrentfuturesprocess.py",第239行,進程內工作進程 R=Call_Item.fn(*Call_Item.args,**Call_Item.kwargs)文件"C:UsersNinoAppDataLocalProgramsPythonPython37libconcurrentfuturesprocess.py",第198行,進程內區塊返回[FN(*args)for Args in Chunk]文件"C:UsersNinoAppDataLocalProgramsPythonPython37libconcu💞rrentfuturesprocess.py",第198行,輸入返回[fn(*args)for args in chunk]TypeError:MyFunction()缺少4個必需的位置參數:‘P_systemPort’, ‘p_deviceName’、‘p_version’和‘p_os’"

上述異常是以下異常的直接原因:

回溯(最近一次調用):文件 "E:/DropboxBACKUP14112018/Cff/Python/project_GITHUB/test2.py",線路 24,英寸對于多進程中的多進程:文件"C:UsersNinoAppDataLocalProgramsPythonPython37libconcurrentfuturesprocess.py",第483行,In_Chain_From_Iterable_Of_List 對于可迭代中的元素:文件"C:UsersNinoAppDataLocalProgramsPythonPython37libconcurrentfutures_base.py",結果迭代器中的第598行 Year fs.op()."C:UsersNinoAppDataLocalProgramsPythonPython37libconcurrentfutures_base.py",()文件第435行,結果返回SELF。__GET_RESULT()文件"C:UsersNinoAppDataLocalProgramsPythonPython37libconcurrentfutures_base.py",第384行,位于__GET_RESULT 引發SEEL._EXCEPTION類型錯誤:MyFunction()缺少4個必需的位置參數:‘p_systemPort’、‘p_deviceName’、‘p_version’和 ‘p_os

我嘗試了與我的問題類似的所有答案中的不同內容,但沒有成功。

有人能幫幫我嗎?

精準答案

以下是使其工作的方法:

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'}]