问题描述
我正在寻找一种简单且依赖轻的方法来包装 Python 库以将其公开:
a) 网络,无论是通过 HTTP 还是其他一些自定义协议,都没有那么重要,也不需要加密。 b) 本地机器,这里的主要目的是避免库导入开销,理想情况下,这将通过有效的机制ala管道或共享内存发生,以最大限度地减少数据副本和[反]序列化的数量。
创建一个持续运行的类似乎很容易,例如镜像库功能并返回例如的 HTTP 接口与答案对应的腌制对象。但是让它有效地工作并涵盖各种边缘情况似乎很乏味,我想知道是否有更好的方法来做到这一点,最好是 Python 本身内置的方法。
Ray 似乎有一些使用 Actors 的功能,但它看起来很重,安装时容易失败,所以我很好奇有哪些替代方案。
另外,可能是“库问题”太多了,如果您认为它更适合另一个堆栈交换网站,请告诉我哪个,我会从这里删除它。
解决方法
您最好的选择是 Flask 或 FASTAPi。 两者都是轻量级且非常有弹性的 Web 框架,它们也很容易开始使用(可能需要在您的函数中添加一个装饰器来实现您的目标)。 您还可以将您的 API 与 Swagger UI 结合使用,以便与您的 API 资源进行可视化交互。
附言Ray actor 与您的请求无关(它们只是旨在以分布式方式运行/使用的有状态对象)。
,一个相对简单和轻量级的解决方案是使用 RPC 并公开您现有的函数。
例如:
服务器:
from xmlrpc.server import SimpleXMLRPCServer
def is_even(n):
return n % 2 == 0
server = SimpleXMLRPCServer(("localhost",8000))
print("Listening on port 8000...")
server.register_function(is_even,"is_even")
server.serve_forever()
函数也可以以装饰器的方式注册,而不是调用server_function(is_even,"is_even")
:
@server.register_function
def is_even(n):
return n % 2 == 0
客户:
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
print("3 is even: %s" % str(proxy.is_even(3)))
print("100 is even: %s" % str(proxy.is_even(100)))