在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中map的基本用法示例
Sep 10 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
django迁移文件migrations的实现
Mar 31 Python
Python生成器generator原理及用法解析
Jul 20 Python
Python代码注释规范代码实例解析
Aug 14 Python
使用Python操作MySQL的小技巧
Sep 10 Python
python反爬虫方法的优缺点分析
Nov 25 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生成便于打印的网页
2006/10/09 PHP
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
jQuery 表单验证扩展(三)
2010/10/20 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Django 用户认证组件使用详解
2019/07/23 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
Python实现元素等待代码实例
2019/11/11 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
意向协议书范本
2014/04/23 职场文书
贷款委托书怎么写
2014/08/02 职场文书
委托证明范本
2014/11/25 职场文书
先进班组事迹材料
2014/12/25 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫