在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脚本生成Android SALT扰码的方法
Sep 18 Python
Python批量重命名同一文件夹下文件的方法
May 25 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
Python字符串的一些操作方法总结
Jun 10 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
Python字典底层实现原理详解
Dec 18 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
Apr 22 Python
Pytorch转tflite方式
May 25 Python
Python脚本实现监听服务器的思路代码详解
May 28 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
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
初识laravel5
2015/03/02 PHP
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
JavaScript ParseFloat()方法
2015/12/18 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
简单实现js悬浮导航效果
2017/02/05 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
Python内置函数之filter map reduce介绍
2014/11/30 Python
Python程序运行原理图文解析
2018/02/10 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
使用python制作一个解压缩软件
2019/11/13 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
Qoo10台湾站:亚洲领先的在线市场
2018/05/15 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
工程力学硕士生的自我评价范文
2013/11/16 职场文书
校园创业策划书
2014/01/14 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
企业团队精神心得体会
2016/01/19 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL