2017-06-21 9 views
1

Ich möchte zwei POST-Anfragen von einer API auf einer Django-Ansicht gleichzeitig machen.Python Asyncio in Django Anzeigen

So würde ich es außerhalb von Django tun.

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

Ich bin verwirrt über die Ereignisschleife. Wie kann ich das in meiner Django-Ansicht tun? Muss ich dafür verschachtelte Funktionen verwenden?

def ibmaudio_ibm(request, language1, language2): 
    #Asyncio code here 

Edit: Wie ist dies auch ein Duplikat betrachtet? Parallele Aufrufe und Scheduling mit Crontab sind völlig verschiedene Dinge ...

+0

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

+0

Mögliches Duplikat von [Verwendung von asyncio zur Ausführung periodischer Aufgaben in Django] (https://stackoverflow.com/questions/43838872/using-asyncio-to-do-periodic-task-in-django) – e4c5

+0

@ e4c5 Es hat nichts zu tun Ich plane mit parallelen Aufgaben ... Nicht einmal in der Nähe eines Duplikats – Juanvulcano

Antwort

3

Lösung war, die Funktion in einem anderen zu verschachteln.

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 ist ein synchrones Framework, so dass Sie keine async/await in den Ansichten verwenden können, weil dort keine Schleife oder etwas ähnliches.

Sie können wirklich Django-Kanäle-Bibliothek dafür verwenden, aber es wird Ihre Ansichten asynchron unter der Haube selbst machen, müssen Sie nicht async auch verwenden, nur verbinden Sie die Kanäle und gehen Sie auf Codierung wie Sie es tun , ohne Async-Funktionen.