通过网络和本地公开 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)))
我正在寻找一种简单且依赖性轻的方法来包装 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)))