一个Python软件包,可将功能调用卸载到在Localhost上运行的HTTP服务器,自动使用装饰器。与多处理,泡菜,烧瓶,fastapi,异步等兼容。
想象一下一个多螺纹或多处理应用程序的情况,其中1个或几个功能是大量资源(CPU或内存)密集的,但是其他功能可以并行运行。
示例-API调用,然后使用大型DL模型进行令牌化和分类,然后再进行进一步的API调用。
在这种情况下,创建服务器(通常使用Torchserve或tfserving)以服务请求并用对服务器的发布请求替换功能调用是有意义的。
ServerHandler创建同步服务器,并在运行时自动替换对函数的任何调用。
向运行http.server.httpserver的过程的1个实例提出了请求,该过程在其中运行该功能。
也可以使用AsyncServerHandler,从而使请求异步。
即使是由不同的过程,线程,多处理,烧瓶,FastAPI和异步事件循环进行的调用,也可以在同一服务器过程中进行。
一般来说 :
some code with a callable
可以用ServerHandler或AsyncServerHandler的实例替换,该实例将代码作为字符串作为第一个参数中的字符串以及可callable的名称作为第二个参数。
from auto_function_serving . ServerHandler import ServerHandler
callable_name = ServerHandler ( """
some independent code with a callable
""" , "callable_name" )例子 :
import module1
import module2
def functionname ( someinput ):
a = module1 . function1 ( someinput )
return module2 . function2 ( a )可以替换
from auto_function_serving . ServerHandler import AsyncserverHandler
functionname = AsyncServerHandler ( """
import module1
import module2
def functionname(someinput):
a = module1.function1(someinput)
return module2.function2(a)
""" , "functionname" , port = "Any" )装饰器( @asyncserverhandler.decorator和 @serverhandler.decorator)和asyncserverhandler详细信息。
from auto_function_serving . ServerHandler import ServerHandler
callable_name = ServerHandler ( """
some independent code with a callable
""" , "callable_name" , port = None , backend = 'Popen' , wait = 100 , backlog = 1024 ))运行http.server.httpserver。
ServerHandler和AsyncServerHandler对象可以加载并用泡菜卸载。
使用Popen或多处理来运行服务器。
仅使用单个外部依赖项(AIOHTTP),仅用于异步。
http,而不是https。
根据输入哈希选择端口。 (除非另有说明)
最小代码更改。
几乎所有Cpython Envs中的功能几乎都应兼容。 (不确定在哪里可能失败?如果您找到问题,请添加一个问题。)
内存泄漏或错误(来自服务器)极不可能,因为它是最小的,单线的,单个过程和Python STDLIB的默认组件。
异常导致5xx错误而无需关闭服务器。
除非另有说明,否则即使是单独的进程也会向同一服务器的1个实例提出请求。 (因为它在特定端口上寻找服务器。)。
可以通过将端口设置为任何自由端口,以便将新的ServerHandler对象启动新服务器来指定。
HTTP帖子请求:轻巧,几乎没有MS开销,可靠。
异步是一个很好的功能。
现在有测试。
除非使用装饰符,否则将代码作为参数的代码不是Pythonic。
即使使用了装饰器,进口内部功能也不是理想的选择。
HTTP帖子请求:不安全,几乎没有MS开销。
服务器内部的例外未发送。
没有批处理。
没有内置的记录。 (可以添加)。初始化延迟最多几秒钟以启动服务器。异步函数在服务器上不起作用。
如果服务器关闭,则无自动服务器重新启动。
如果不正确关闭,可能会使一些锁定的资源锁定一段时间(<1分钟)。
如果不可用或多处理,可能会出现问题。
可能与Jupyter嵌套异步错误?请研究Nest-Asyncio和问题。
有些骇人听闻(但合法且功能齐全)解决的警告。
由于某种原因(测试和不太可能),在DEL和ATEXIT.REDISTER( DEL )中关闭服务器进程。
使用软件包管理器pip安装auto_function_serving
pip install auto_function_serving服务器的代码存储在serverhandler.base_code中,并使用一些字符串格式来填充空白。
服务器进程是从Popen开始的(或指定的多处理)。它要做的第一件事是导入套接字并绑定端口 - 如果不可用,则代码在异常后停止。因此,只有1个服务器实例可以在机器上运行。
我们知道功能已经准备就绪,在我们可以从服务器中接收有效的获取请求。
输入和输出作为字节发送,使用泡菜转换为对象。
如果初始化时端口不在(默认)时,则通过哈希输入代码选择将其独立于函数来源来选择50000至60000的端口。可能会发生不同功能的碰撞,但不太可能。在多个过程中相同功能的碰撞用于确保一次仅1个服务器进程运行。如果需要,可以指定端口。
用于小输入和输出的开销(很少) -
〜2ms for Urllib.Request的请求
〜4ms,用于使用AIOHTTP.Clientsession的异步请求
大型输入和输出的开销
0.5 MB输入和输出(1MB总传输)的〜10ms。
5 MB输入和输出(10 MB总传输)〜60ms。
50 MB输入和输出(100 MB总传输)〜600ms。
它也可以与提供的装饰器一起用于功能,没有函数之外的依赖项。
from auto_function_serving . ServerHandler import ServerHandler
@ ServerHandler . decorator
def someheavyfunction ( args , ** kwargs ):
for i in range ( big_number )
someexpensivecomputation该功能中的导入将起作用
from auto_function_serving . ServerHandler import ServerHandler
@ ServerHandler . decorator
def someheavyfunction ( args , ** kwargs ):
import numpy as np from auto_function_serving . ServerHandler import ServerHandler
@ ServerHandler . decorator
def someheavyfunction ( args , ** kwargs ):
if not hasattr ( someheavyfunction , 'RunOnce' ):
global np
import numpy as np
setattr ( someheavyfunction , 'RunOnce' , None )
... etc当somemodule没有任何昂贵的全球加载时。
from auto_function_serving . ServerHandler import ServerHandler
from somemodule import someheavyfunction
someheavyfunction = ServerHandler . decorator ( someheavyfunction )在创建新实例之前,可以通过设置serverhandler.ip_address(默认“ 127.0.0.1”)来更改IP地址。
还可以使用AioHTTP异步使请求异步,与FastAPI和其他异步用例一起使用。
AsyncServerHandler具有与ServerHandler相同的用法,除非需要等待或与asyncio.run()或asyncio.get_event_loop()。run_un_until_complete()一起使用呼叫。
通过设置AsyncServerHandler.TCPConnector_Limit控制TCPConnector限制(默认为100),可以限制异步调用的数量。使用信号量也是要考虑的事情。
图书馆:芹菜,tfserving,torchserve,烧瓶
向全球和当地人发送执行
阿斯特树
欢迎拉动请求。
Apache许可证2.0