2017-06-21 16 views
1

私はDjangoビューで同時に2つのPOSTリクエストをAPIから作成したいと考えています。Python Asyncio in Django View

これは私が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での並列呼び出しとschedullingはまったく別のものです...

+0

http://channels.readthedocs.io/en/stable/faqs.html#why-are-you-doing-this-rather-than-just-using-tornado-gev​​ent-asyncio-etc –

+0

[djangoでasyncioを使って定期的にタスクを実行する]の可能な複製(https://stackoverflow.com/questions/43838872/using-asyncio-to-do-periodic-task-in-django) – e4c5

+0

@ e4c5何もしない私はパラレルコールを望んでいます...重複しても近くにありません – Juanvulcano

答えて

3

解決策は、関数を別の関数の内部にネストすることでした。

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) 
3

Djangoは同期フレームワークなので、ループがないなどの理由でビュー内にasync/awaitを使用することはできません。

実際にはDjangoチャンネルライブラリを使用できますが、それだけでフードの下で非同期に表示されます。asyncも使用する必要はありません。非同期機能はありません。