我想在每次执行flask路径时执行异步函数.目前我的abar函数从未执行过.你能告诉我为什么吗?非常感谢你:
import asyncio
from flask import Flask
async def abar(a):
print(a)
loop = asyncio.get_event_loop()
app = Flask(__name__)
@app.route("/")
def notify():
asyncio.ensure_future(abar("abar"), loop=loop)
return "OK"
if __name__ == "__main__":
app.run(debug=False, use_reloader=False)
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
我也尝试将一个阻塞调用放在一个单独的线程中.但它仍然没有称之为abar功能.
import asyncio
from threading import Thread
from flask import Flask
async def abar(a):
print(a)
app = Flask(__name__)
def start_worker(loop):
asyncio.set_event_loop(loop)
try:
loop.run_forever()
finally:
loop.close()
worker_loop = asyncio.new_event_loop()
worker = Thread(target=start_worker, args=(worker_loop,))
@app.route("/")
def notify():
asyncio.ensure_future(abar("abar"), loop=worker_loop)
return "OK"
if __name__ == "__main__":
worker.start()
app.run(debug=False, use_reloader=False)
Run Code Online (Sandbox Code Playgroud) 我正在编写一个我希望最终用户可以选择使用的库,就像它的方法和函数不是协同程序一样.
例如,给定此功能:
@asyncio.coroutine
def blah_getter():
return (yield from http_client.get('http://blahblahblah'))
Run Code Online (Sandbox Code Playgroud)
不关心在自己的代码中使用任何异步功能的最终用户仍然需要导入asyncio并运行:
>>> response = asyncio.get_event_loop().run_until_complete(blah_getter())
Run Code Online (Sandbox Code Playgroud)
如果可以的话,这将是很酷的,blah_getter确定我是否被称为协程,并做出相应的反应.
所以类似于:
@asyncio.coroutine
def blah_getter():
if magically_determine_if_being_yielded_from():
return (yield from http_client.get('http://blahblahblah'))
else:
el = asyncio.get_event_loop()
return el.run_until_complete(http_client.get('http://blahblahblah'))
Run Code Online (Sandbox Code Playgroud)