tornado實現(xiàn)流式

from concurrent.futures import ThreadPoolExecutor
from tornado.concurrent import run_on_executor
import asyncio

class ChatHandler(tornado_factory("rest")):
    '''
    流式問答
    '''
    executor = ThreadPoolExecutor(max_workers=4)  # 創(chuàng)建線程池

    async def post(self):
        data = self.get_json()
        self.set_header("Content-Type", "text/event-stream")
        self.set_header("Cache-Control", "no-cache")

        queue = asyncio.Queue()  # 創(chuàng)建一個隊列用于數(shù)據(jù)傳遞
        asyncio.create_task(self.run_prediction(data, queue))
         # 在主線程中不斷從隊列中取數(shù)據(jù)并發(fā)送
        while not self.request.connection.stream.closed():
            result = await queue.get()
            if result is None:
                break
            self.write(result + '\n')
            await self.flush()

    async def run_prediction(self, data, queue):
        # 將同步生成器放入線程池執(zhí)行,逐步將生成結(jié)果放入隊列
        loop = asyncio.get_running_loop()

        def blocking_predict():
            # predict 是同步生成器,逐步生成預(yù)測結(jié)果
            for result in predict(data):
                # 使用 run_coroutine_threadsafe 將結(jié)果安全地放入隊列
                asyncio.run_coroutine_threadsafe(queue.put(result), loop)

        await loop.run_in_executor(self.executor, blocking_predict)

        # 放入 None 表示生成器結(jié)束
        await queue.put(None)

class ChatNostreamHandler(tornado_factory("rest")):
    '''
    非流式問答
    '''
    executor = ThreadPoolExecutor(max_workers=4)  # 創(chuàng)建線程池

    async def post(self):
        data = self.get_json()
        await self.run_prediction(data)


    @run_on_executor
    def run_prediction(self, data):
        try:
            result = ''
            for char in predict(data):
                result += char
            return self.json_response(status="OK", result=result)
        except:
            return self.json_response(status="Failed", code=500)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文聰老師點醒我(D363) 昨晚上在接孩子路上孩子問我為什么要上大學(xué),考個好的大學(xué)還可以,考不好的大學(xué)有啥用...
    A心簡單世界就簡單閱讀 82評論 0 0
  • 藝術(shù)首先是一種情感的表達(dá)。無論是繪畫、音樂、舞蹈還是文學(xué),藝術(shù)家們通過他們的作品傳達(dá)著內(nèi)心的情感和體驗。梵高的《星...
    f82842869d5c閱讀 57評論 0 1
  • 華杉老師講道:“「品牌資產(chǎn)」是能給我們帶來效益的消費者的品牌認(rèn)知,兩個效益:第一,買我產(chǎn)品;第二,傳我美名。了解了...
    戢程閱讀 111評論 0 1
  • 解鈴還得系鈴人。 有了事兒了,壓著。不如移交出去。誰的事兒誰負(fù)責(zé)。勇于承擔(dān)示弱也是一種解脫。 嗯作為領(lǐng)導(dǎo)發(fā)現(xiàn)問題,...
    飄蕩著的那朵閱讀 73評論 0 2
  • P60—61 1、胡光書: 先有積極培養(yǎng)人,后有企業(yè)的發(fā)展壯大。 虹霖:先有積極培養(yǎng)人,后有企業(yè)的發(fā)展壯大。
    李虹霖閱讀 85評論 0 0

友情鏈接更多精彩內(nèi)容