只是个伪代码例子,  原代码量大,只能弄了个结构上一致的简单的例子,
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 字典内容必须传进去,散写逐个参数,非常麻烦的。。。
|      1xiaolinjia      2020-09-22 16:45:05 +08:00 方式 1 的写法没问题,报那错是因为多进程在 windows 下要用 pickle 模块将环境的所有对象序列化,再 copy 一份给其他进程。所以是 procFun 函数里面有什么对象是不能 pickle 序列化吧。 | 
|  |      2VYSE      2020-09-22 17:07:33 +08:00 taskInfo 这个 dict 里存了 thread lock, 所以不能序列化传递到子进程 | 
|  |      3pppguest3962 OP 醍醐灌顶,谢谢两位,找到原因了,多线程 /进程环境不同,我在在 taskInfo 里,就把 queen 队列的地址传进去使用了,       ltQueen = queue.LifoQueue() taskInfo = {'ltQueen': ltQueen} 其实很希望能在子进程里,能做 put 任务到主线程 /进程的队列 ltQueen 的操作,我看看试试能不能解决这个问题。。。,如果不成功,还是会发帖请教~~ |