我有一个带有Flask API的Python应用程序,它使用asyncio进行了一些并行工作。这需要一段时间才能完成,因此我不时要使用服务器发送的事件向网站报告进度。
我想到的最好的主意(我知道这是垃圾,完全不是线程安全的,但这只是一个例子):
import asyncio
from threading import Thread
counter = 0
def background_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
async def something(t):
await asyncio.sleep(t)
async def generator():
pending = [something(t) for t in range(0, 5)]
while pending:
done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
for task in done:
yield task.result()
async def consumer():
global counter
async for _ in generator():
counter += 1
loop = asyncio.new_event_loop()
t = Thread(target=background_loop, args=(loop,), daemon=True)
t.start()
#here would be the endpoint
task = asyncio.run_coroutine_threadsafe(consumer(), loop)
while counter != 5:
print(counter)
有没有更好的方法可以做到这一点?谢谢!