问题
After perusing many docs on AsyncIO
and articles I still could not find an answer to this : Run a function asynchronously (without using a thread) and also ensure the function calling this async function continues its execution.
Pseudo - code :
async def functionAsync(p):
#...
#perform intensive calculations
#...
print ("Async loop done")
def functionNormal():
p = ""
functionA(p)
return ("Main loop ended")
print ("Start Code")
print functionNormal()
Expected Output :
Start code
Main loop ended
Async loop done
Searched examples where loop.run_until_complete
is used, but that will not return the print value of functionNormal()
as it is blocking in nature.
回答1:
asyncio
can't run arbitrary code "in background" without using threads. As user4815162342 noted is asyncio
you run event loop that blocks main thread and manages execution of coroutines.
If you want to use asyncio
and take advantage of using it, you should rewrite all your functions that uses coroutines to be coroutines either up to main function - entry point of your program. This main coroutine is usually passed to run_until_complete
. This little post reveals this topic in more detail.
Since you're interested in Flask, take a look Quart: it's a web framework that tries to implement Flask API (as much as it's possible) in terms of asyncio
. Reason this project exists is because pure Flask isn't compatible with asyncio
. Quart is written to be compatible.
If you want to stay with pure Flask, but have asynchronous stuff, take a look at gevent. Through monkey-patching it can make your code asynchronous. Although this solution has its own problems (which why asyncio
was created).
来源:https://stackoverflow.com/questions/55647753/call-async-function-from-sync-function-while-the-synchronous-function-continues