在Django的View中使用asyncio的方法


Posted in Python onJuly 12, 2019

起步

Django 是个同步框架,本文并不是 让 Django 变成异步框架。而是对于在一个 view 中需要请求多次 http api 的场景。

一个简单的例子

例子来源于 https://stackoverflow.com/questions/44667242/python-asyncio-in-django-view :

def djangoview(request, language1, language2):
 async def main(language1, language2):
  loop = asyncio.get_event_loop()
  r = sr.Recognizer()
  with sr.AudioFile(path.join(os.getcwd(), "audio.wav")) as source:
   audio = r.record(source)
  def reco_ibm(lang):
   return(r.recognize_ibm(audio, key, secret language=lang, show_all=True))
  future1 = loop.run_in_executor(None, reco_ibm, str(language1))
  future2 = loop.run_in_executor(None, reco_ibm, str(language2))
  response1 = await future1
  response2 = await future2
 loop = asyncio.new_event_loop()
 asyncio.set_event_loop(loop)
 loop = asyncio.get_event_loop()
 loop.run_until_complete(main(language1, language2))
 loop.close()
 return(HttpResponse)

这个例子中,把两个任务放到 asyncio 的 loop 运行,等到两个任务都完成了再返回 HttpResponse 。

在 Django 的 View 中使用 asyncio

现在可以对于上面的例子做一个扩充,让它能更合理被使用。

对于使用 asyncio ,我们通常会创建个子线程专门处理异步任务。

在 wsgi.py 中创建一个单独线程并运行事件循环:

import asyncio
import threading

...
application = get_wsgi_application()

# 创建子线程并等待
thread_loop = asyncio.new_event_loop()
def start_loop(loop):
 asyncio.set_event_loop(loop)
 loop.run_forever()

t = threading.Thread(target=start_loop, args=(thread_loop,), daemon=True)
t.start()

然后就是在 view 中动态向里面添加任务了:

async def fetch(url):
  async with aiohttp.ClientSession() as session:
   async with session.get(url) as response:
    text = await response.text()
    return text

def hello(request):
 from yeezy_bot.wsgi import thread_loop

 fut1 = asyncio.run_coroutine_threadsafe(fetch(url1), thread_loop)
 fut2 = asyncio.run_coroutine_threadsafe(fetch(url2), thread_loop)

 ret1 = fut1.result()
 ret2 = fut2.result()
 return HttpResponse('')

asyncio.run_coroutine_threadsafe() 返回是 Future 对象,因此可以通过 fut.result() 获得任务的运行结果。 这个方式也可以处理API请求中的数据依赖的先后顺序。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈python中的数字类型与处理工具
Aug 02 Python
Python微信库:itchat的用法详解
Aug 14 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
python pandas库中DataFrame对行和列的操作实例讲解
Jun 09 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
Python自动发送邮件的方法实例总结
Dec 08 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
Mar 06 Python
解决django 向mysql中写入中文字符出错的问题
May 18 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 #Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 #Python
基于sklearn实现Bagging算法(python)
Jul 11 #Python
Python的log日志功能及设置方法
Jul 11 #Python
python使用装饰器作日志处理的方法
Jul 11 #Python
Python日志无延迟实时写入的示例
Jul 11 #Python
深入了解Python iter() 方法的用法
Jul 11 #Python
You might like
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
PHP strripos函数用法总结
2019/02/11 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
pyside写ui界面入门示例
2014/01/22 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
python的命名规则知识点总结
2019/10/04 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
介绍一下UNIX启动过程
2013/11/14 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
铁路工务反思材料
2014/02/07 职场文书
八年级英语教学计划
2015/01/23 职场文书
如何写新闻稿
2015/07/18 职场文书
2016教师廉洁教育心得体会
2016/01/13 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
Python语言中的数据类型-序列
2022/02/24 Python
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis