跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教 concurrent.futures 的多进程 ProcessPoolExecutor, sumit 提交任务,如何正确把字典作为参数传入?
未分類
24 9 月 2020

请教 concurrent.futures 的多进程 ProcessPoolExecutor, sumit 提交任务,如何正确把字典作为参数传入?

请教 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)

  • 資深大佬 : xiaolinjia

    方式 1 的写法没问题,报那错是因为多进程在 windows 下要用 pickle 模块将环境的所有对象序列化,再 copy 一份给其他进程。所以是 procFun 函数里面有什么对象是不能 pickle 序列化吧。

  • 資深大佬 : VYSE

    taskInfo 这个 dict 里存了 thread lock, 所以不能序列化传递到子进程

  • 主 資深大佬 : pppguest3962

    醍醐灌顶,谢谢两位,找到原因了,多线程 /进程环境不同,我在在 taskInfo 里,就把 queen 队列的地址传进去使用了,
    ltQueen = queue.LifoQueue()
    taskInfo = {‘ltQueen’: ltQueen}
    其实很希望能在子进程里,能做 put 任务到主线程 /进程的队列 ltQueen 的操作,我看看试试能不能解决这个问题。。。,如果不成功,还是会发帖请教~~

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具