请教 concurrent.futures 的多进程 ProcessPoolExecutor, sumit 提交任务,如何正确把字典作为参数传入?
資深大佬 : pppguest3962 2
只是个伪代码例子, 原代码量大,只能弄了个结构上一致的简单的例子,
procFun 在没套入到多进程的时候,工作得很好,是一个闭包,不会与其它什么的造成干涉。。。
BABTaskDict = {'TkNum':32, 'TkString':'test String'} def procFun(taskInfo): taskNumber = taskInfo.get('TkNum') taskString = taskInfo.get('TkString') ... ... pass with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor: to_do = [] #executor.submit 返回 future 实例 future = executor.submit(procFun, BABTaskDict ) # 方式 1 # 方式 2 future = executor.submit(procFun, *BABTaskDict ) # 方式 3 future = executor.submit(procFun, **BABTaskDict ) to_do.append(future)
用了方式 1 的方法,会有如下提示:
Traceback (most recent call last): File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libmultiprocessingqueues.py", line 234, in _feed obj = _ForkingPickler.dumps(obj) File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libmultiprocessingreduction.py", line 51, in dumps cls(buf, protocol).dump(obj) TypeError: can't pickle _thread.lock objects
用了方式 2 的方法,future.result()有如下:
File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libconcurrentfutures_base.py", line 432, in result return self.__get_result() File "C:UsersAdministratorAppDataLocalProgramsPythonPython36libconcurrentfutures_base.py", line 384, in __get_result raise self._exception TypeError: procFun() takes 1 positional argument but 17 were given
用了方式 3 的方法,与方式 1 一样,
是不是姿势不对?
没其它选择,info 字典内容必须传进去,散写逐个参数,非常麻烦的。。。
大佬有話說 (3)