通过网络和本地公开 Python 库 API 的快速且有弹性的方式
Posted
技术标签:
【中文标题】通过网络和本地公开 Python 库 API 的快速且有弹性的方式【英文标题】:Quick and resilient way to expose a python library API over the network as well as locally 【发布时间】:2021-05-14 17:34:09 【问题描述】:我正在寻找一种简单且依赖轻量级的方式来包装 python 库以将其公开:
a) 网络,无论是通过 HTTP 还是其他一些自定义协议,都无关紧要,并且不需要加密。 b) 本地机器,这里的主要目的是避免库导入开销,理想情况下,这将通过有效的机制 ala 管道或共享内存来最小化数据副本和 [反] 序列化的数量。
创建一个持续运行的类似乎很容易,例如一个 HTTP 接口,镜像库功能并返回例如与答案相对应的腌制对象。但是让它高效地工作并涵盖各种边缘情况似乎很乏味,我想知道是否有更好的方法来做到这一点,最好是内置在 python 本身中的方法。
Ray 似乎有一些使用 Actors 的功能,但它似乎相当重量级并且在安装时容易失败,所以我很好奇存在哪些替代方案。
另外,“图书馆问题”可能太过分了,如果您认为它更适合另一个堆栈交换网站,请告诉我哪个,我会从这里删除它。
【问题讨论】:
你尝试了什么? FastAPI 或 Hug 这样的模块怎么样。如果您使用 HTTP 公开,那么您也可以在本地使用它。但是,如果想在本地运行它,那么如果您的 Internet 提供商每 24 小时更改一次您的 IP 并且为了您的安全它会阻止一些端口,那么问题可能是从网络访问。 @furas 这些是 HTTP,主要问题是我必须重新定义我所有功能的 API。然而,这些 API 应该只能从 python 访问,所以存在一个库似乎是合理的,它只接受库导出的所有函数并自动生成 API,而用户(我)不必处理重写每个端点(再加上所需的所有数据整理,并且在从这些端点发送和接收内容时必须在调用方进行数据转换) 【参考方案1】:您的最佳选择是Flask 或FASTAPi。 两者都是轻量级且非常有弹性的 Web 框架,也很容易开始使用(可能是在你的函数中添加一个装饰器来实现你的目标)。 您还可以将您的 API 与 Swagger UI 耦合,以与您的 API 资源进行可视化交互。
附: Ray Actor 与您的请求无关(它们只是有状态的对象,旨在以分布式方式运行/使用)。
【讨论】:
> Ray Actor 与您的请求无关(它们只是有状态的对象,旨在以分布式方式运行/使用)。 - 怎么会?从资源消耗的角度来看,它们似乎表现得像单独的进程,而不是对象。这正是我想要的,行为类似于 python 对象/模块但从资源角度来看本质上是一个单独的进程 @George 你没有提到(在你原来的问题中)关于在单独的进程中运行一些代码的任何事情。另外,我认为您正在混合一些概念:光线演员首先是更广泛的 Ray 框架中的开发范例,具有可以扩展/实现的类 API。重新分配资源,你是对的 - 每个新的射线演员被实例化,一个新的工作人员被创建,每个工作人员被分配一个单独的进程。【参考方案2】:一个相对简单和轻量级的解决方案是使用 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#
【讨论】:
这可能是最接近我需要的。 RPC 在某些方面并不理想,但我完全忘记了这是一件事并且赏金今天到期,所以非常感谢您的回答:)以上是关于通过网络和本地公开 Python 库 API 的快速且有弹性的方式的主要内容,如果未能解决你的问题,请参考以下文章
如何向 Internet 公开 Web API 以授予与同一网络上的不同计算机连接的能力
Python爬虫编程思想:使用urllib库发送HTTP请求和接收响应
Python使用Face++的人脸识别detect API进行本地图片情绪识别并存入excel
Python爬虫编程思想(21):使用requests网络库抓取二进制数据提交POST请求和处理响应数据