它可以使用multiprocessing.managers
模块要达到什么
# spam.py
import pathlib
def listdir(p):
return [str(c) for c in pathlib.Path(p).iterdir()]
Python的2模块你要。它确实需要少量的黑客攻击。
既然有要公开功能的模块,那么你需要创建一个Manager
可以创建为这些功能的代理。
,供应来代理PY3功能
管理器进程:
我已经重新定义spam
到包含两个函数调用add
和sub
。
# spam.py
def add(x, y):
return x + y
def sub(x, y):
return x - y
客户端进程使用由SpamManager
公开的py3函数。
from __future__ import print_function
from multiprocessing.managers import BaseManager
class SpamManager(BaseManager):
pass
SpamManager.register("get_spam")
m = SpamManager(address=('localhost', 50000), authkey=b'abc',
serializer='xmlrpclib')
m.connect()
spam = m.get_spam()
print("1 + 2 = ", spam.add(1, 2)) # prints 1 + 2 = 3
print("1 - 2 = ", spam.sub(1, 2)) # prints 1 - 2 = -1
spam.__name__ # Attribute Error -- spam is a module, but its __name__ attribute
# is not exposed
一旦建立,这个表单提供了一种访问函数和值的简单方法。它还允许以类似的方式使用这些函数和值,如果它们不是代理,则可以使用它们。最后,它允许您在服务器进程上设置密码,以便只有经过授权的进程才能访问管理器。经理长时间运行,也意味着您不必为每个函数调用启动一个新进程。
一个限制是我使用xmlrpclib
模块而不是pickle
在服务器和客户端之间来回发送数据。这是因为python2和python3对pickle
使用不同的协议。您可以通过将您自己的客户端添加到multiprocessing.managers.listener_client
来解决此问题,该协议使用商定的协议来进行酸洗对象。
是你在backports中的函数吗? –