如何将多个参数传递给由 concurrent.futures.ProcessPoolExecutor executor.map() 迭代的函数
How to pass several parameters to a function which is iterated by executor.map() from concurrent.futures.ProcessPoolExecutor
该问题已在 Whosebug 中多次发布,但其中 none 可以帮助我,因为我的情况非常具体。
我有一个函数 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: """ Traceback (most
recent call last): File
"C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py",
line 239, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs) File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py",
line 198, in _process_chunk
return [fn(*args) for args in chunk] File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py",
line 198, in
return [fn(*args) for args in chunk] TypeError: Myfunction() missing 4 required positional arguments: 'p_systemPort',
'p_deviceName', 'p_version', and 'p_os' """
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File
"E:/DropboxBACKUP14112018/Cff/Python/project_GITHUB/test2.py", line
24, in
for multiprocess in multiprocesses: File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py",
line 483, in _chain_from_iterable_of_lists
for element in iterable: File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures_base.py",
line 598, in result_iterator
yield fs.pop().result() File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures_base.py",
line 435, in result
return self.__get_result() File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures_base.py",
line 384, in __get_result
raise self._exception TypeError: Myfunction() missing 4 required positional arguments: 'p_systemPort', 'p_deviceName', 'p_version', and
'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'}]
该问题已在 Whosebug 中多次发布,但其中 none 可以帮助我,因为我的情况非常具体。
我有一个函数 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: """ Traceback (most recent call last): File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py", line 239, in _process_worker r = call_item.fn(*call_item.args, **call_item.kwargs) File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py", line 198, in _process_chunk return [fn(*args) for args in chunk] File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py", line 198, in return [fn(*args) for args in chunk] TypeError: Myfunction() missing 4 required positional arguments: 'p_systemPort', 'p_deviceName', 'p_version', and 'p_os' """
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "E:/DropboxBACKUP14112018/Cff/Python/project_GITHUB/test2.py", line 24, in for multiprocess in multiprocesses: File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures\process.py", line 483, in _chain_from_iterable_of_lists for element in iterable: File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures_base.py", line 598, in result_iterator yield fs.pop().result() File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures_base.py", line 435, in result return self.__get_result() File "C:\Users\Nino\AppData\Local\Programs\Python\Python37\lib\concurrent\futures_base.py", line 384, in __get_result raise self._exception TypeError: Myfunction() missing 4 required positional arguments: 'p_systemPort', 'p_deviceName', 'p_version', and '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'}]