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



我正在寻找一种简单且不依赖的包装python库的方法:

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

创建一个持续运行的类似乎是一件很容易的工作,例如,使用HTTP接口镜像库功能,并返回与答案相对应的pickle对象。但是让它有效地工作并覆盖各种边缘情况似乎很乏味,我想知道是否有更好的方法来做到这一点,理想情况下是内置到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)))

详细信息:https://docs.python.org/3/library/xmlrpc.server.html#

最新更新