user13405941
user13405941

Reputation:

How to NOT await in asyncio

I do not want to await my function. Look at this code:

loop = asyncio.new_event_loop() # Needed because of flask server
asyncio.set_event_loop(loop)    # Needed because of flask server
task = loop.create_task(mainHandler(code, send, text)) #Start mainHandler

return formResponse(True, "mainHandler Started") # Run this without awaiting the task

This is part of a function called on a flask server endpoint. I don't really care how mainHandler is started, all I want is that it starts and the function (not mainHandler) immediately returns without awaiting. I have tried scheduling tasks, using futures and just running it but all to no avail. Even this question describing exactly what I need did not help: How to run an Asyncio task without awaiting? Does anyone have experience with this?

When trying to use asyncio.create_task in this example:

from flask import Flask
from flask import request
import asyncio

app = Flask(__name__)

async def mainHandler(code: str, sends: int, sendText: str):
    await asyncio.sleep(60) # simulate the time the function takes

@app.route('/endpoint')
def index():
    code = request.args.get('code', default = "NOTSET", type = str)
    send = request.args.get('send', default = 0, type = int)
    text = request.args.get('text', default = "NOTSET", type = str).replace("+", " ")

    if (code != "NOTSET" and send > 0 and text != "NOTSET"):
        
        asyncio.create_task(mainHandler(code, send, text))

        return {"error":False}
    else:
        return {"error":True}

if __name__ == '__main__':
    app.debug = True
    app.run(host="0.0.0.0", port=80)

It throws:

RuntimeError: no running event loop

when calling asyncio.create_task(mainHandler(code, send, text)).

Upvotes: 0

Views: 423

Answers (1)

user13405941
user13405941

Reputation:

To sum this up for everyone coming here in the future:

The version of Flask I used was sync. I just switched to Sanic which is similar in Syntax (only minor differences), faster and supports async via asyncio.ensure_future(mainHandler(code, send, text)).

According to gre_gor (Thank you!) you should also be able to use pip install flask[async] to install async flask.

Upvotes: 2

Related Questions