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中的异步的主要内容,如果未能解决你的问题,请参考以下文章

异步任务队列Celery在Django中的使用

django rest框架中的异步

Django 和 Celery 中的异步逻辑

vue axios异步请求django

异步消息队列和处理,如 django 中的 Amazon Simple Queue 服务

Django是同步的还是异步的?