与 Django 的异步

ver*_*o71 7 python django multithreading loops python-asyncio

我正在尝试在我的 Django 后处理中使用 asyncio,例如:

query : # a query to my model
tasks =  []        
for record in query:
    tasks.append(do_something_with_google_calendar(record))

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
Run Code Online (Sandbox Code Playgroud)

但我只是在执行时遇到错误:

loop = asyncio.get_event_loop()

RuntimeError: There is no current event loop in thread 'Thread-17'.
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

先感谢您

Cha*_*nel 6

您的原始代码不起作用,因为 get_event_loop() 方法只是 get_event_loop_policy().get_event_loop() 的快捷方式,它仅为主线程自动创建和返回事件循环。为了使其正常工作,您需要为每个当前线程上下文显式创建和设置新的事件循环:

query : # a query to my model
tasks =  []        
for record in query:
    tasks.append(do_something_with_google_calendar(record))

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关此内容的更多信息。


ver*_*o71 2

看来如果我这样做,它会起作用:

query : # a query to my model
tasks =  []        
for record in query:
    tasks.append(do_something_with_google_calendar(record))

loop = asyncio.SelectorEventLoop()
asyncio.set_event_loop(loop)

loop.run_until_complete(asyncio.wait(tasks))
loop.close()
Run Code Online (Sandbox Code Playgroud)

我希望它很稳定,并且在 UNIX 中也能像在 Windows 中一样正常工作