fast api 전역 스레드

BackEnd_Ash.log·2023년 7월 21일
0

FASTAPI

목록 보기
3/3

fast api 에서는 기본적으로 비동기를 지원해준다.


async def test_api_one():
   response_data = await test_api_one_service()
   return response_data

async def test_api_two():
   response_data_two = await test_api_two_service()
   return response_data_two

이렇게 하면 test_api_one API 가 호출을 하는동안
test_api_two API 가 요청을 기다리지 않고 반환을 하게 된다.

하지만 예외적인 상황이 존재한다.
openai 를 사용하는 상황에서는 다른 병렬처리를 해줘야한다.
다른 외부 API 를 사용하게 될때 외부 API 가 비동기 처리를 지원해주지 않고 동기 처리만을 지원하게 된다면 별도의 스레드를 사용해서 구현해야한다.
다음은 chat gpt 한테 물어봤을때의 답변이다.

현재 OpenAI Python 클라이언트는 동기식(synchronous) 호출만 지원하며, 비동기식(asynchronous) 호출을 직접 지원하지 않습니다. 이는 클라이언트 라이브러리의 한계로, Python await 키워드를 이용한 비동기 처리를 적용하려면 몇 가지 추가적인 작업이 필요합니다.

하나의 방법은 별도의 스레드에서 OpenAI API 호출을 실행하는 것입니다. Python의 concurrent.futures 모듈을 사용하여 별도의 스레드에서 API 호출을 실행하고, 결과를 비동기적으로 받아올 수 있습니다.

아래에 간단한 예제를 제시합니다:

import openai
from concurrent.futures import ThreadPoolExecutor
from fastapi import FastAPI

app = FastAPI()

executor = ThreadPoolExecutor(max_workers=5)

async def async_openai_call(guard_string, result_string):
    loop = asyncio.get_running_loop()
    response = await loop.run_in_executor(executor, openai.ChatCompletion.create,
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": guard_string},
            {"role": "user", "content": result_string}
        ],
        temperature=1,
        max_tokens=1000,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    return response

@app.get("/api_a")
async def api_a(guard_string: str, result_string: str):
    response = await async_openai_call(guard_string, result_string)
    return response

이 코드는 FastAPI 애플리케이션에서 OpenAI API 호출을 비동기적으로 처리합니다. 별도의 스레드에서 API 호출을 실행하고, 그 결과를 비동기적으로 반환합니다. 이렇게 하면 FastAPI 애플리케이션은 다른 요청을 처리하는 동안 API 호출을 기다리지 않아도 됩니다.

이 방법의 단점은 스레드를 관리하고 제어하는 복잡성이 있으며, 스레드의 수가 많아지면 리소스 사용량도 늘어나게 됩니다. 따라서 이 방법이 항상 최적의 솔루션은 아닐 수 있습니다.

더 나은 비동기 처리를 위해서는 OpenAI 호출을 처리하는 별도의 비동기 서비스를 만들거나, 비동기 작업 큐 등을 사용하는 방법을 고려해 보세요.

profile
꾸준함이란 ... ?

0개의 댓글