Decorator를 사용하여 LocalHost에서 실행되는 HTTP 서버로 기능 호출을 오프로드하는 Python 패키지. 멀티 프로세싱, 피클, 플라스크, Fastapi, Async 등과 호환됩니다.
1 이하의 기능이 리소스 (CPU 또는 메모리) 집중적 인 멀티 스레드 또는 멀티 프로세싱 애플리케이션의 경우를 상상해보십시오. 그러나 다른 기능은 병렬로 실행될 수 있습니다.
예 - API 호출과 큰 DL 모델을 사용한 토큰 화 및 분류 후 추가 API 호출이 이어집니다.
이 경우 서버 (일반적으로 Torchserve 또는 Tfserving 사용)를 작성하여 요청을 제공하고 기능 호출을 서버에 대한 게시물 요청으로 바꾸는 것이 합리적입니다.
ServerHandler는 동기 서버를 생성하고 런타임 중에 모든 호출을 기능으로 대체합니다.
http.server.httpserver를 실행하는 프로세스 1 인스턴스에 대한 요청은 그 내에서 함수를 실행합니다.
AsyncserverHandler도 사용할 수 있으며 요청을 비동기 적으로 만듭니다.
다른 프로세스, 스레드, 멀티 프로세싱, 플라스크, FastApi 및 Async 이벤트 루프로 동일한 서버 프로세스를 통해 이루어진 호출조차도 동일한 서버 프로세스에 이루어집니다.
일반적으로 :
some code with a callable
첫 번째 인수의 문자열로 코드를 허용하는 ServerHandler 또는 AsyncServerHandler 인스턴스로 대체 할 수 있습니다.
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 또는 Multiprocessing을 사용하여 서버를 실행합니다.
단일 외부 의존성 (AIOHTTP) 만 사용하며 비동기에만 사용됩니다.
HTTP가 아닌 HTTP.
입력 해시를 기반으로 포트를 선택합니다. (달리 지정되지 않는 한)
최소 코드 변경.
거의 모든 Cpython Envs의 거의 모든 기능과 호환되어야합니다. (어디에서 실패 할 수 있는지 확실하지 않습니까? 문제를 찾으면 문제를 추가하십시오.)
메모리 누출 또는 오류 (서버의)는 최소 단일 스레드, 단일 프로세스 및 Python stdlib의 기본 구성 요소이기 때문에 거의 가능성이 낮습니다.
예외는 서버를 닫지 않고 5xx 오류를 유발합니다.
별도의 프로세스조차도 달리 지정되지 않는 한 동일한 서버의 1 인스턴스를 요청합니다. (특정 포트에서 서버를 찾고 있기 때문에).
새 ServerHandler 객체가 새 서버를 시작하도록 포트를 모든 자유 포트로 설정하여 달리 지정할 수 있습니다.
HTTP Post 요청 : 경량, 소수의 MS 오버 헤드, 신뢰할 수 있습니다.
비동기는 좋은 기능입니다.
이제 테스트가 있습니다.
데코레이터가 사용되지 않는 한 클래스에 대한 인수로 코드 문자열을 갖는 것은 피시닉이 아닙니다.
데코레이터를 사용하는 경우에도 내부 기능을 가져 오는 것이 이상적이지 않습니다.
HTTP Post 요청 : 불안, 소수의 MS 오버 헤드.
서버 내부의 예외는 다시 전송되지 않습니다.
배치가 없습니다.
내장 로깅이 없습니다. (추가 될 수 있음). 초기화 서버를 시작하는 데 최대 몇 초의 지연. 비동기 기능은 서버에서 작동하지 않습니다.
서버가 닫히는 경우 자동 서버가 다시 시작되지 않습니다.
제대로 닫히지 않은 경우 일부 리소스를 잠시 잠자리에 넣을 수 있습니다 (<1 분).
Popen 또는 Multiprocessing을 사용할 수없는 경우 문제가 발생할 수 있습니다.
Jupyter 또는 기타로 중첩 된 비동기 오류가 발생할 수 있습니까? Nest-Asyncio와 문제를 살펴보십시오.
다소 해킹 된 (그러나 합법적이고 완전히 기능적인) 해결 방법의 경고.
del 및 atexit.redister ( del )에서 서버 프로세스 폐쇄는 어떤 이유로 든 실패합니다 (테스트 및 가능성은 거의 없습니다).
패키지 관리자 PIP를 사용하여 auto_function_serving을 설치하십시오
pip install auto_function_serving 서버의 코드는 ServerHandler.base_code에 저장되며 일부 문자열 형식은 빈 공백을 채우는 데 사용됩니다.
서버 프로세스는 Popen으로 시작됩니다 (또는 지정된 경우 멀티 프로세싱). 가장 먼저하는 일은 소켓을 가져 와서 포트를 바인딩하는 것입니다. 사용할 수없는 경우 코드는 예외 후에 중지됩니다. 따라서 서버의 1 인스턴스 만 시스템에서 한 번에 실행됩니다.
우리는 서버에서 유효한 GET 요청을받은 후에 기능이 준비되어 있음을 알고 있습니다.
입력 및 출력은 바이트로 전송되며 피클을 사용하여 물체로 변환됩니다.
초기화 중에 포트가 없으면 (기본값), 50000에서 60000의 포트는 입력 코드를 해싱하여 함수의 소스와 독립적으로 선택합니다. 다른 기능의 충돌은 가능하지만 가능성은 거의 없습니다. 여러 프로세스에서 동일한 기능의 충돌은 한 번에 1 개의 서버 프로세스 만 실행되도록하는 데 사용됩니다. 필요한 경우 포트를 지정할 수 있습니다.
작은 입력 및 출력에 대한 오버 헤드 (몇 바이트) -
urllib.request 요청에 대한 ~ 2ms
aiohttp.clientsession을 사용한 비동기 요청에 대한 ~ 4ms
큰 입력 및 출력에 대한 오버 헤드
0.5MB 입력 및 출력의 경우 ~ 10ms (1MB 총 전송).
5MB 입력 및 출력의 경우 ~ 60ms (총 전송).
50MB 입력 및 출력의 경우 ~ 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 )
... etcSomemodule에 고가의 전역 로딩이 없을 때.
from auto_function_serving . ServerHandler import ServerHandler
from somemodule import someheavyfunction
someheavyfunction = ServerHandler . decorator ( someheavyfunction )새 인스턴스를 작성하기 전에 ServerHandler.ip_address (기본 "127.0.0.1")를 설정하여 IP 주소를 변경할 수 있습니다.
ASYNCSERVERHANDLER도 AIOHTTP를 사용하여 FASTAPI 및 기타 비동기 사용 사례와 함께 사용하기 위해 요청을 비동기 적으로 만들 수 있습니다.
AsyncserverHandler는 asyncio.run () 또는 asyncio.get_event_loop ().
TCPConnector 한계 (기본 100)를 제어하는 AsyncserverHandler.tcpConnector_limit을 설정하여 비동기 호출 수를 제한 할 수 있습니다. 세마포어를 사용하는 것도 고려해야 할 사항입니다.
도서관 : Celery, Tfserving, Torchserve, Flask
글로벌과 현지인들에게 exec
AST 나무
풀 요청을 환영합니다.
아파치 라이센스 2.0