Mic*_*ael 5 python multiprocessing rpyc python-multiprocessing
我试图在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()
Run Code Online (Sandbox Code Playgroud)
这是产生错误的客户端代码:
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)
Run Code Online (Sandbox Code Playgroud)
您可以在协议配置中启用酸洗。配置存储为字典,您可以修改默认值并将其传递给服务器 ( 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()
Run Code Online (Sandbox Code Playgroud)
代码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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1314 次 |
| 最近记录: |