带有 RPYC 的多处理 Python “ValueError:酸洗已禁用”
Posted
技术标签:
【中文标题】带有 RPYC 的多处理 Python “ValueError:酸洗已禁用”【英文标题】:Multiprocessing Python with RPYC "ValueError: pickling is disabled" 【发布时间】:2014-11-13 00:06:17 【问题描述】:我试图在rpyc
服务中使用多处理包,但是当我尝试从客户端调用公开的函数时得到ValueError: pickling is disabled
。我知道multiprocesing
包使用酸洗在进程之间传递信息,并且rpyc
中不允许酸洗,因为它是一个不安全的协议。所以我不确定将多处理与 rpyc 一起使用的最佳方法(或者是否有)。如何在 rpyc 服务中使用多处理?这是服务器端代码:
import rpyc
from multiprocessing import Pool
class MyService(rpyc.Service):
def exposed_RemotePool(self, function, arglist):
pool = Pool(processes = 8)
result = pool.map(function, arglist)
pool.close()
return result
if __name__ == "__main__":
from rpyc.utils.server import ThreadedServer
t = ThreadedServer(MyService, port = 18861)
t.start()
这是产生错误的客户端代码:
import rpyc
def square(x):
return x*x
c = rpyc.connect("localhost", 18861)
result = c.root.exposed_RemotePool(square, [1,2,3,4])
print(result)
【问题讨论】:
***.com/questions/1816958/… 对象通常可以被腌制(它只是一个整数),但 rpyc 禁止腌制,因此(看似)使用腌制的多处理。我没有实现新协议,我正在尝试使用 rpyc。如果做不到,我会寻找其他解决方案,但我宁愿不重新发明***。如果无法做到,我会不知道为什么 rpyc 存在,即如果您只能在多核机器上使用一个处理器,那么使用另一台机器有什么意义。 在网络环境中不容易实现多线程的原因有很多。其中之一是 CPU 分配是在内核内部完成的,用户空间线程库只能请求使用这个工具——但并不总是保证。说得好:intermediate-and-advanced-software-carpentry.readthedocs.org/en/…(GIL 使多线程与单线程一样快,并且“全局”锁在单个主机内)。 尝试在rpyc的配置allow_pickle=True
中设置。
@shx2 目前尚不清楚如何将该设置传递给服务(请参阅下面对答案的评论)。
【参考方案1】:
您可以在协议配置中启用酸洗。配置存储为字典,您可以修改 default 并将其传递给服务器 (protocol_config
= ) 和客户端 (config =
)。您还需要在客户端和服务器端定义并行化的函数。所以这里是server.py
的完整代码:
import rpyc
from multiprocessing import Pool
rpyc.core.protocol.DEFAULT_CONFIG['allow_pickle'] = True
def square(x):
return x*x
class MyService(rpyc.Service):
def exposed_RemotePool(self, function, arglist):
pool = Pool(processes = 8)
result = pool.map(function, arglist)
pool.close()
return result
if __name__ == "__main__":
from rpyc.utils.server import ThreadedServer
t = ThreadedServer(MyService, port = 18861, protocol_config = rpyc.core.protocol.DEFAULT_CONFIG)
t.start()
client.py
的代码是:
import rpyc
rpyc.core.protocol.DEFAULT_CONFIG['allow_pickle'] = True
def square(x):
return x*x
c = rpyc.connect("localhost", port = 18861, config = rpyc.core.protocol.DEFAULT_CONFIG)
result = c.root.exposed_RemotePool(square, [1,2,3,4])
print(result)
【讨论】:
【参考方案2】:您应该在协议配置中启用它。见http://rpyc.readthedocs.org/en/latest/api/core_protocol.html#rpyc.core.protocol.DEFAULT_CONFIG
【讨论】:
我在顶部的代码中添加了rpyc.core.protocol.DEFAULT_CONFIG['allow_pickle'] = True
,但我仍然收到错误消息。不确定如何更改 ThreadedServer 对象的此设置。以上是关于带有 RPYC 的多处理 Python “ValueError:酸洗已禁用”的主要内容,如果未能解决你的问题,请参考以下文章
python专属的Remote Produce Call框架:rpyc