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相关推荐

  1. 高性能框架gevent和gunicorn在web上的应用及性能测试

    比如 Flask,webpy,Django.CherryPy 都带着 WSGI server .当然性能都不好,自带的web server 更多的是测试用途, 线上发布时,则使用高性能的 wsgi s ...

  2. python 协程、进程、线程_Python 中的进程、线程、协程

    1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...

  3. nginx对websocket的支持及uliweb chatroom的测试

    2019独角兽企业重金招聘Python工程师标准>>> 在尝试在uliweb中使用gevent开发聊天室时,已经在网上搜到nginx是支持websocket的代理的,不过应该不支持集 ...

  4. Linux 高并发核心配置

    1.open file(调整同时打开文件数量)的限制 使用命令ulimit -a可以查看 修改在 vim /etc/security/limits.conf 文件最后输入 建议配置:注意open fi ...

  5. python 软件工程_软件工程实践之 django/python

    outline 本文包括以下内容:outline django: 一个搭建后端服务的工具箱.framework: django vs flask/tornado/spring/laravel rest ...

  6. python 软件工程,软件工程实践之 django/python | 码农网

    软件工程实践系列文章, 会着重讲述实际的工程项目中是如何协作开发软件的. 本文主要介绍了 django/python 系列的 工具 链. outline 本文包括以下内容: outline djang ...

  7. 从零开始编写一个宠物识别系统(爬虫、模型训练和调优、模型部署、Web服务)

    心血来潮,想从零开始编写一个相对完整的深度学习小项目.想到就做,那么首先要考虑的问题是,写什么? 思量再三,我决定写一个宠物识别系统,即给定一张图片,判断图片上的宠物是什么.宠物种类暂定为四类--猫. ...

  8. WSGI Server

    1 WSGI WSGI是 Web Server Gateway Interface 的缩写,它是 Python应用程序(application)或框架(如 Django)和 Web服务器之间的一种接口 ...

  9. flask gevent uwsgi nginx 联合高并发 部署

    1 python代码 /home/run.py from gevent import monkey monkey.patch_all()from flask import Flask app = Fl ...

最新文章

  1. 视图的getWidth()和getHeight()返回0
  2. VC++6.0出现no compile tool is associated with the extension.解决方法
  3. CentOS系统启动流程及GRUB文件说明
  4. 【笔记】基于边缘检测和BP神经网络的大豆杂草识别研究
  5. 64ubuntu编译32位程序
  6. VSCode详细安装教程
  7. 小程序统一服务消息_微信团队发布小程序模板消息能力调整通知:小程序订阅消息接口正式上线...
  8. 验证码计时 -- UIButton setTitle 闪烁问题解决方案
  9. pgsql与mysql数据类型对比_PostgreSQL和mysql数据类型对比兼容
  10. 小米账号登陆无法连接服务器,登录小米账号显示,无法连接网络,怎么回事?...
  11. 一些常用的物理特殊符号的读法
  12. 金山终端安全系统任意文件上传漏洞附poc(新鲜趁热)
  13. 解决在浏览器中打开java文件jnlp报错“该文件没有程序与之关联来执行该操作...”
  14. ubuntu 中下载openssh源码移植到 arm开发,出现you don't exist, go away问题的解决
  15. SEO静态页面生成系统
  16. 3.1 Linux 支持的文件系统类型
  17. 经常上夜班,作息颠倒,对身体会有哪些影响?
  18. sonar 使用常见问题总结
  19. 东芝2323AM复印机双面打印设置方法
  20. H3C防止同网段arp欺骗攻击配置

热门文章

  1. 多重继承_Java语言编程第25讲——Java中多重继承,也会导致模棱两可的歧义
  2. matlab 图像平滑的算法_图像相似度---灰度分布算法---用matlab实现
  3. java构造方法可以重载吗_Java基础教程之构造器与方法重载
  4. 「高并发秒杀」linux安装软件有哪几种方式
  5. 【PAT (Advanced Level) Practice】1008 Elevator (20 分)
  6. python【数据结构与算法】最大上升子序列(简单dp)
  7. Json数据发布到Tomcat本地服务器
  8. 登录MySQL非默认3306端口号的语句
  9. 习题2.5 两个有序链表序列的合并 (15 分)
  10. 计算机在有机合成中的应用,计算机在有机合成中的应用