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

Quick and resilient way to expose a python library API over the network as well as locally

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

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

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

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

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

您的最佳选择是 Flask or FASTAPi。 两者都是轻量级且非常有弹性的 Web 框架,也很容易开始使用(可能只需向您的函数添加一个装饰器即可实现您的目标)。 您还可以将 API 与 Swagger UI 结合使用,以便与您的 API 资源进行视觉交互。

P.S。 Ray actor 与您的请求无关(它们只是有状态的对象,旨在以分布式方式run/used)。

一个相对简单和轻量级的解决方案是使用 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()

函数也可以用 decorator 方式注册,而不是调用 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#