它可以使用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中的函數嗎? –