Có thể sử dụng các mô-đun multiprocessing.managers
để đạt được những gì bạn muốn. Nó đòi hỏi một số lượng nhỏ của hack mặc dù.
Với mô-đun có chức năng bạn muốn hiển thị, bạn cần tạo một Manager
có thể tạo proxy cho các chức năng đó.
quá trình quản lý phục vụ proxy để các chức năng py3:
from multiprocessing.managers import BaseManager
import spam
class SpamManager(BaseManager):
pass
# Register a way of getting the spam module.
# You can use the exposed arg to control what is exposed.
# By default only "public" functions (without a leading underscore) are exposed,
# but can only ever expose functions or methods.
SpamManager.register("get_spam", callable=(lambda: spam), exposed=["add", "sub"])
# specifying the address as localhost means the manager is only visible to
# processes on this machine
manager = SpamManager(address=('localhost', 50000), authkey=b'abc',
serializer='xmlrpclib')
server = manager.get_server()
server.serve_forever()
Tôi đã định nghĩa lại spam
để chứa hai chức năng gọi add
và sub
.
# spam.py
def add(x, y):
return x + y
def sub(x, y):
return x - y
quy trình khách hàng sử dụng chức năng py3 được hiển thị bởi SpamManager
.
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
Sau khi thiết lập, biểu mẫu này cung cấp cách dễ dàng để truy cập các chức năng và giá trị. Nó cũng cho phép các hàm và giá trị này sử dụng chúng theo cách tương tự mà bạn có thể sử dụng chúng nếu chúng không phải là proxy. Cuối cùng, nó cho phép bạn đặt mật khẩu trên quy trình máy chủ để chỉ các quy trình được ủy quyền mới có thể truy cập trình quản lý. Rằng người quản lý đang chạy dài, cũng có nghĩa là một quy trình mới không phải được bắt đầu cho mỗi cuộc gọi hàm mà bạn thực hiện.
Một hạn chế là tôi đã sử dụng mô-đun xmlrpclib
thay vì pickle
để gửi dữ liệu qua lại giữa máy chủ và ứng dụng khách. Điều này là do python2 và python3 sử dụng các giao thức khác nhau cho pickle
. Bạn có thể sửa lỗi này bằng cách thêm ứng dụng khách của riêng bạn vào multiprocessing.managers.listener_client
sử dụng giao thức đã thỏa thuận cho các đối tượng tẩy.
Chức năng của bạn có trong backport không? –