通过网络和本地公开 Python 库 API 的快速且有弹性的方式

问题描述

我正在寻找一种简单且依赖轻的方法来包装 Python 库以将其公开:

a) 网络,无论是通过 HTTP 还是其他一些自定义协议,都没有那么重要,也不需要加密。 b) 本地机器,这里的主要目的是避免库导入开销,理想情况下,这将通过有效的机制ala管道或共享内存发生,以最大限度地减少数据副本和[反]序列化的数量

创建一个持续运行的类似乎很容易,例如镜像库功能并返回例如的 HTTP 接口与答案对应的腌制对象。但是让它有效地工作并涵盖各种边缘情况似乎很乏味,我想知道是否有更好的方法来做到这一点,最好是 Python 本身内置的方法

Ray 似乎有一些使用 Actors 的功能,但它看起来很重,安装时容易失败,所以我很好奇有哪些替代方案。

另外,可能是“库问题”太多了,如果您认为它更适合另一个堆栈交换网站,请告诉我哪个,我会从这里删除它。

解决方法

您最好的选择是 FlaskFASTAPi。 两者都是轻量级且非常有弹性的 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)))

更多信息:https://docs.python.org/3/library/xmlrpc.server.html#