只是个伪代码例子, 原代码量大,只能弄了个结构上一致的简单的例子,
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:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\multiprocessing\queues.py", line 234, in _feed
obj = _ForkingPickler.dumps(obj)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\multiprocessing\reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
TypeError: can't pickle _thread.lock objects
用了方式 2 的方法,future.result()有如下:
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\concurrent\futures\_base.py", line 432, in result
return self.__get_result()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\concurrent\futures\_base.py", line 384, in __get_result
raise self._exception
TypeError: procFun() takes 1 positional argument but 17 were given
用了方式 3 的方法,与方式 1 一样,
是不是姿势不对?
没其它选择,info 字典内容必须传进去,散写逐个参数,非常麻烦的。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.