Python multiprocessing.Pool():我能返回的内容是否受到限制?
我正在使用Python的多处理池。有人告诉我,虽然我自己没有经历过这一点,因此我无法发布代码,但不能将Python multiprocessing.Pool():我能返回的内容是否受到限制?,python,parallel-processing,distributed-computing,Python,Parallel Processing,Distributed Computing,我正在使用Python的多处理池。有人告诉我,虽然我自己没有经历过这一点,因此我无法发布代码,但不能将多处理.Pool()-工作者中的任何内容“返回”到多处理.Pool()的主进程。像“酸洗”和“锁”这样的词被到处乱扔,但我不确定 这是正确的吗?如果是,这些限制是什么 在我的例子中,我有一个函数,它生成一个可变类对象,然后在完成一些工作后返回它。我希望有8个进程运行这个函数,生成它们自己的类,并在完成后返回每个类。完整的代码尚未编写,因此我无法发布 我可能会遇到什么问题 我的代码是:res=po
多处理.Pool()
-工作者中的任何内容“返回”到多处理.Pool()
的主进程。像“酸洗”和“锁”这样的词被到处乱扔,但我不确定
这是正确的吗?如果是,这些限制是什么
在我的例子中,我有一个函数,它生成一个可变类对象,然后在完成一些工作后返回它。我希望有8个进程运行这个函数,生成它们自己的类,并在完成后返回每个类。完整的代码尚未编写,因此我无法发布
我可能会遇到什么问题
我的代码是:res=pool.map(foo,参数列表)
Q:“这是正确的吗?如果是,这些限制是什么?”
视情况而定。这是正确的,但这里的问题是SER/DES处理,因为一对不相交的进程试图“发送”某些东西(那里:一个带有参数的任务规范,返回:…是的,等待已久的结果*)
负责这项工作的Python标准模块库的初始版本,pickle
-module无法序列化一些更复杂类型的对象,类实例就是这样一个例子
当然,有越来越多的新版本在不断发展,但是这个SER/DES步骤是SPOF之一,在某些情况下可能会避免平滑的代码执行
接下来是这样的情况,当O/S请求尽可能多的内存分配时抛出内存错误,O/S简单地拒绝任何新的分配请求,整个过程试图生成和发送pickle.dumps(…)
不可解析地崩溃
我们有什么补救办法吗?
好吧,也许是,也许不是-Mike McKern的dill
在某些情况下可能有助于更好地处理SER/DES处理中的复杂对象
可尝试使用进口莳萝作为腌菜;pickle.dump(…)
并测试热门候选的Class()
-实例,以获得SER/DES ed,如果它们有机会通过。如果不是的话,就没办法先用这个低挂水果的把戏
接下来,一种不太容易的方法是避免依赖硬连线的多处理.Pool()
-实例化及其(上述)受限的SER/comms/DES方法,并基于通信代理范例将处理策略设计为系统
这样,您就可以在足够智能的代理之间进行大小合适、设计恰到好处的通信交换,这些代理知道(正如您设计它们所知道的那样)要告诉其他代理什么,即使不发送任何乳齿象大小的BLOB,也会意外地破坏任何SPoF中的处理你不能同时防止事后补救
在2020年至2020年第四季度,我所知道的或可以预见的安全、智能地实现这一点似乎没有更好的方法。是pool multiprocessing.pool,因为周围有不同的池。如果是multiprocessing.pool,您可以处理可拾取的对象,请参见此处:只要每个函数返回不同的可变对象,就可以了。多重处理要求对象是可酸洗的,但实际的酸洗是在背后进行的。