我想同时在Django视图上从API发出两个POST请求。
这就是我在django之外做的事情。
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视图中做到这一点?我需要为此使用嵌套函数吗?
def ibmaudio_ibm(request, language1, language2):
#Asyncio code here
编辑:这怎么会被认为是重复的呢?使用crontab进行并行调用和调度是完全不同的事情……
发布于 2017-06-22 02:01:29
解决方案是将该函数嵌套在另一个函数中。
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)
发布于 2017-06-21 13:23:56
Django是一个同步框架,所以你不能在视图中使用任何async/await
,因为没有循环或类似的东西。
你真的可以使用Django channels库,但它会让你的视图在幕后异步,你也不需要使用async
,只需像以前一样继续编码连接通道,而不需要任何异步特性。
https://stackoverflow.com/questions/44667242
复制相似问题