2017-08-17 4 views
1

Ich möchte lernen, wie man eine Funktion asynchron in Python3 aufruft. Ich denke Tornado kann dies tun. Derzeit ist mein Code nichts auf der Kommandozeile zurückkehrt:Asynchroner Funktionsaufruf

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

async def count(end): 
    """Print message when start equals end.""" 
    start = 0 
    while True: 
     if start == end: 
      print('start = {0}, end = {1}'.format(start, end)) 
      break 
     start = start + 1 

def main(): 

    # Start counting. 
    yield count(1000000000) 

    # This should print while count is running. 
    print('Count is running. Async!') 

if __name__ == '__main__': 
    main() 

Dank

Antwort

1

eine Asynchron-Funktion aufzurufen, müssen Sie eine Ereignisschleife schaffen, sie zu handhaben. Wenn Sie einen Tornado App haben, bietet es eine solche Schleife, die Sie Ihre Handler asynchron machen können:

from tornado.web import RequestHandler, url 
from tornado.httpserver import HTTPServer 
from tornado.ioloop import IOLoop 


async def do_something_asynchronous(): 
    # e.g. call another service, read from database etc 
    return {'something': 'something'} 


class YourAsyncHandler(RequestHandler): 

    async def get(self): 
     payload = await do_something_asynchronous() 
     self.write(payload) 


application = web.Application([ 
    url(r'/your_url', YourAsyncHandler, name='your_url') 
]) 

http_server = HTTPServer(application) 
http_server.listen(8000, address='0.0.0.0') 
IOLoop.instance().start() 

Außerhalb eines Tornado-App können Sie die Ereignisschleife aus einer beliebigen Anzahl von Anbietern erhalten, einschließlich der integrierten in asyncio Bibliothek:

import asyncio 
event_loop = asyncio.get_event_loop() 
try: 
    event_loop.run_until_complete(do_something_asynchronous()) 
finally: 
    event_loop.close() 
+1

Vielen Dank, Berislav :) –