Django中的异步
Posted
技术标签:
【中文标题】Django中的异步【英文标题】:Asyncio in Django 【发布时间】:2018-03-17 12:03:17 【问题描述】:我正在使用一个执行 asyncio 函数的模块来通过抓取获取 cmets,该代码在 Python 脚本中完美运行,但 Django 似乎没有执行 Asyncio 代码。我收到一个错误提示
线程 'Thread-3' 中没有当前事件循环。
def comments(request):
if request.method == 'POST':
async def main():
q = Query('Donald Trump', limit=20)
async for tw in q.get_comments():
print(tw)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
loop.run_until_complete(loop.shutdown_asyncgens())
finally:
loop.close()
form = CommentForm(request.POST)
if form.is_valid():
return HttpResponseRedirect('/index.html')
else:
form = CommentForm()
return render(request, 'index.html', 'form': form)
通过在线程内部使用 Asyncio 进行一些脏线程工作,我能够执行循环,但只能执行一次。
【问题讨论】:
去掉关闭循环的代码,应该就没事了。 @user4815162342 试过了。没有任何改变。 尝试使用loop = asyncio.new_event_loop(); asyncio.set_event_loop(loop)
创建一个新循环
成功了,谢谢!
【参考方案1】:
错误消息There is no current event loop in thread 'Thread-3'.
表示您正在从主线程外部访问 asyncio。你可以使用set_event_loop
来设置:
def run_coro(coro):
try:
loop = asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop.run_until_complete(coro)
然后,在comments
:
run_coro(main())
【讨论】:
以上是关于Django中的异步的主要内容,如果未能解决你的问题,请参考以下文章