首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django视图中的Python Asyncio

Django视图中的Python Asyncio
EN

Stack Overflow用户
提问于 2017-06-21 13:08:23
回答 2查看 16K关注 0票数 18

我想同时在Django视图上从API发出两个POST请求。

这就是我在django之外做的事情。

代码语言:javascript
复制
import asyncio
import speech_recognition as sr

async def main(language1, language2):
    loop = asyncio.get_event_loop()
    r = sr.Recognizer()
    with sr.AudioFile(path.join(os.getcwd(), "audio.wav")) as source:
        audio = r.record(source)
    def reco_ibm(lang):
        return(r.recognize_ibm(audio, key, secret language=lang, show_all=True))
    future1 = loop.run_in_executor(None, reco_ibm, str(language1))
    future2 = loop.run_in_executor(None, reco_ibm, str(language2))
    response1 = await future1
    response2 = await future2

loop = asyncio.get_even_loop()
loop.run_until_complete(main("en-US", "es-ES"))

我对事件循环感到困惑。我如何在我的Django视图中做到这一点?我需要为此使用嵌套函数吗?

代码语言:javascript
复制
def ibmaudio_ibm(request, language1, language2):
     #Asyncio code here

编辑:这怎么会被认为是重复的呢?使用crontab进行并行调用和调度是完全不同的事情……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-22 02:01:29

解决方案是将该函数嵌套在另一个函数中。

代码语言:javascript
复制
def djangoview(request, language1, language2):
    async def main(language1, language2):
        loop = asyncio.get_event_loop()
        r = sr.Recognizer()
        with sr.AudioFile(path.join(os.getcwd(), "audio.wav")) as source:
            audio = r.record(source)
        def reco_ibm(lang):
            return(r.recognize_ibm(audio, key, secret language=lang, show_all=True))
        future1 = loop.run_in_executor(None, reco_ibm, str(language1))
        future2 = loop.run_in_executor(None, reco_ibm, str(language2))
        response1 = await future1
        response2 = await future2
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(language1, language2))
    loop.close()
    return(HttpResponse)
票数 24
EN

Stack Overflow用户

发布于 2017-06-21 13:23:56

Django是一个同步框架,所以你不能在视图中使用任何async/await,因为没有循环或类似的东西。

你真的可以使用Django channels库,但它会让你的视图在幕后异步,你也不需要使用async,只需像以前一样继续编码连接通道,而不需要任何异步特性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44667242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档