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

pppguest3962:只是个伪代码例子, 原代码量大,只能弄了个结构上一致的简单的例子,
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 字典内容必须传进去,散写逐个参数,非常麻烦的。。。

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

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

存储结果ThreadPoolExecutor - python

我对使用“ concurrent.futures”进行并行处理还很陌生,并且正在测试一些简单的实验。我编写的代码似乎有效,但是我不确定如何存储结果。我试图创建一个列表(“ futures”)并将结果附加到该列表中,但这会大大减慢该过程。我想知道是否有更好的方法可以做到这一点。谢谢。import concurrent.futures import time c…

您可以在您获取()的另一个线程上调用java.util.concurrent.Semaphore.release()吗? - java

我有一个Java模块,该模块需要通过接口同时执行一组任务(以对实现该模块的框架进行低级控制和处理),但是同时执行的操作不是太多,因此java.util.concurrent.Semaphore似乎很完美。我不确定的一个问题是release()和acquire()调用的线程安全性。一个线程可以获取信号量锁,然后另一个线程释放它吗? 参考方案 这是对Javado…

什么时候不使用asyncio有意义? - python

在什么情况下会在asyncio上使用一个线程或执行程序(使用线程)?随着我使用Python(CPython)的经验的进步,它集中于优化工作脚本以批量执行某种形式的Web服务调用并处理响应。但是,经过几代脚本构建之后,我发现自己想知道为什么我不使用最新的脚本?请允许我在下面提供一些背景信息...问题:从服务器A向客户端B请求N个文件,进行处理并将其保存到磁盘。…

如何捕获current.futures._base.TimeoutError - python

我正在尝试捕获run_until_complete中引发的异常,但是无论如何,我似乎都无法正确捕获它们。这是我的最新尝试(请注意,我正在使用Pypputeer,它是Python中的Puppeteer的一个分支,它使用asyncio):import asyncio from pyppeteer.launcher import launch async def …

同步代码块是仅阻塞分配还是整个块体? - java

我有一个数据变量monthArray,可由多个使用者读取,并由单个periodallall预定的更新程序线程定期进行更新。全部异步。我考虑了这两个选项,以安全地执行更新。 ArrayList<String> tempArray = ModelJob.getDistinctMonths(user, true); synchronized (mont…