uwsgi gevent
Gevent循环引擎
Gevent 是一个令人惊奇的非阻塞Python网络库,构建在 libev
和 greenlet
之上。虽然uWSGI支持Greenlet作为挂起-恢复/绿色线程/协程库,但是还需要大量的努力和代码修改才能对gevent起作用。gevent插件要求gevent 1.0.0 和 uWSGI异步/非堵塞模式 (已更新至uWSGI 1.9) 模式。
注意
SignalFramework
完全对Gevent模式有效。每个处理函数将会在一个专用的greenlet中执行。看看tests/ugevent.py
这个例子。- uWSGI多线程模式 (
threads
选项) 对Gevent无效。支持在你的应用中运行Python多线程。 - 把uWSGI的异步API和gevent混在一起是**明确禁止的**。
构建插件 (uWSGI >= 1.4)
当使用默认配置文件的时候,会默认编译gevent插件。 执行以下命令将会安装python插件,以及gevent:
pip install uwsgi
构建插件 (uWSGI < 1.4)
可以在 buildconf
目录中找到一个”gevent”构建配置文件。
python uwsgiconfig --build gevent # or... UWSGI_PROFILE=gevent make # or... UWSGI_PROFILE=gevent pip install git+git://github.com/unbit/uwsgi.git # or... python uwsgiconfig --plugin plugins/gevent # external plugin
以gevent模式运行uWSGI
uwsgi --gevent 100 --socket :3031 --module myapp
或者对于模块化构建:
uwsgi --plugins python,gevent --gevent 100 --socket :3031 --module myapp
–gevent的参数是要生成的异步核数
一个疯狂的例子
以下例子显示如何在请求中休眠,如何发起异步网络请求,以及如何在一个请求已经被关闭之后继续进行一些逻辑处理。
import gevent import gevent.socketdef bg_task():for i in range(1,10):print "background task", igevent.sleep(2)def long_task():for i in range(1,10):print igevent.sleep()def application(e, sr):sr('200 OK', [('Content-Type','text/html')])t = gevent.spawn(long_task)t.join()yield "sleeping for 3 seconds...<br/>"gevent.sleep(3)yield "done<br>"yield "getting some ips...<br/>"urls = ['www.google.com', 'www.example.com', 'www.python.org', 'projects.unbit.it']jobs = [gevent.spawn(gevent.socket.gethostbyname, url) for url in urls]gevent.joinall(jobs, timeout=2)for j in jobs:yield "ip = %s<br/>" % j.valuegevent.spawn(bg_task) # this task will go on after request end
猴子补丁
uWSGI使用原生gevent api,因此,并不需要猴子补丁。即便如此,你的代码也可能需要它,因此,记得在你的应用的开头调用 gevent.monkey.patch_all()
。自uWSGI 1.9起,便利的 --gevent-monkey-patch
选项将会为你完成这个工作。 请注意,uWSGI是在你的应用 启动 的时候进行猴子补丁的,而不是在你的应用 加载 之前。因此,如果你在加载应用的时候加载其他模块,那么你或许仍然需要自己调用 gevent.monkey.patch_all()
。
一个常见的例子是将 psycopg2_gevent
用于django。Django会为每个线程对postgres发起连接 (将其存储在线程变量中)。
随着uWSGI gevent插件运行在一个单一的线程中,这个方法将会导致psycopg中的死锁。启用猴子补丁将会让你映射线程局部变量到greenlet (虽然你可以避免完全猴子补丁,并只调用 gevent.monkey.patch_thread()
) ,然后解决这个问题:
import gevent.monkey gevent.monkey.patch_thread() import gevent_psycopg2 gevent_psycopg2.monkey_patch()
或者 (为所有东西打上猴子补丁)
import gevent.monkey gevent.monkey.patch_all() import gevent_psycopg2 gevent_psycopg2.monkey_patch()
客户端和前端的一些注意事项
- 如果你正在测试一个生成一连串数据的WSGI应用,那么你应该知道,默认情况下
curl
缓存数据知道一个新行出现。因此,你要么确保使用-N
标记来禁用curl的缓存,要么在你的输出中确保有常规的新行。 - 如果你在uWSGI之前使用Nginx,并且希望从你的应用流数据,那么你可能会想要禁用Nginx的缓存。
uwsgi_buffering off;
uwsgi gevent相关推荐
- 高性能框架gevent和gunicorn在web上的应用及性能测试
比如 Flask,webpy,Django.CherryPy 都带着 WSGI server .当然性能都不好,自带的web server 更多的是测试用途, 线上发布时,则使用高性能的 wsgi s ...
- python 协程、进程、线程_Python 中的进程、线程、协程
1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...
- nginx对websocket的支持及uliweb chatroom的测试
2019独角兽企业重金招聘Python工程师标准>>> 在尝试在uliweb中使用gevent开发聊天室时,已经在网上搜到nginx是支持websocket的代理的,不过应该不支持集 ...
- Linux 高并发核心配置
1.open file(调整同时打开文件数量)的限制 使用命令ulimit -a可以查看 修改在 vim /etc/security/limits.conf 文件最后输入 建议配置:注意open fi ...
- python 软件工程_软件工程实践之 django/python
outline 本文包括以下内容:outline django: 一个搭建后端服务的工具箱.framework: django vs flask/tornado/spring/laravel rest ...
- python 软件工程,软件工程实践之 django/python | 码农网
软件工程实践系列文章, 会着重讲述实际的工程项目中是如何协作开发软件的. 本文主要介绍了 django/python 系列的 工具 链. outline 本文包括以下内容: outline djang ...
- 从零开始编写一个宠物识别系统(爬虫、模型训练和调优、模型部署、Web服务)
心血来潮,想从零开始编写一个相对完整的深度学习小项目.想到就做,那么首先要考虑的问题是,写什么? 思量再三,我决定写一个宠物识别系统,即给定一张图片,判断图片上的宠物是什么.宠物种类暂定为四类--猫. ...
- WSGI Server
1 WSGI WSGI是 Web Server Gateway Interface 的缩写,它是 Python应用程序(application)或框架(如 Django)和 Web服务器之间的一种接口 ...
- flask gevent uwsgi nginx 联合高并发 部署
1 python代码 /home/run.py from gevent import monkey monkey.patch_all()from flask import Flask app = Fl ...
最新文章
- 视图的getWidth()和getHeight()返回0
- VC++6.0出现no compile tool is associated with the extension.解决方法
- CentOS系统启动流程及GRUB文件说明
- 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
- 64ubuntu编译32位程序
- VSCode详细安装教程
- 小程序统一服务消息_微信团队发布小程序模板消息能力调整通知:小程序订阅消息接口正式上线...
- 验证码计时 -- UIButton setTitle 闪烁问题解决方案
- pgsql与mysql数据类型对比_PostgreSQL和mysql数据类型对比兼容
- 小米账号登陆无法连接服务器,登录小米账号显示,无法连接网络,怎么回事?...
- 一些常用的物理特殊符号的读法
- 金山终端安全系统任意文件上传漏洞附poc(新鲜趁热)
- 解决在浏览器中打开java文件jnlp报错“该文件没有程序与之关联来执行该操作...”
- ubuntu 中下载openssh源码移植到 arm开发,出现you don't exist, go away问题的解决
- SEO静态页面生成系统
- 3.1 Linux 支持的文件系统类型
- 经常上夜班,作息颠倒,对身体会有哪些影响?
- sonar 使用常见问题总结
- 东芝2323AM复印机双面打印设置方法
- H3C防止同网段arp欺骗攻击配置
热门文章
- 多重继承_Java语言编程第25讲——Java中多重继承,也会导致模棱两可的歧义
- matlab 图像平滑的算法_图像相似度---灰度分布算法---用matlab实现
- java构造方法可以重载吗_Java基础教程之构造器与方法重载
- 「高并发秒杀」linux安装软件有哪几种方式
- 【PAT (Advanced Level) Practice】1008 Elevator (20 分)
- python【数据结构与算法】最大上升子序列(简单dp)
- Json数据发布到Tomcat本地服务器
- 登录MySQL非默认3306端口号的语句
- 习题2.5 两个有序链表序列的合并 (15 分)
- 计算机在有机合成中的应用,计算机在有机合成中的应用