文档章节

Gevent异步服务类实现多姿势WEB实时展示

乐搏学院
 乐搏学院
发布于 2017/02/24 16:12
字数 1307
阅读 4
收藏 0
点赞 0
评论 0

内置服务:

1. gevent.server.StreamServer类, 常用于创建异步TCP服务器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

#

# Authors: limanman

# OsChina: http://xmdevops.blog.51cto.com/

# Purpose:

#

"""

# 说明: 导入公共模块

import time

import gevent

from gevent.server import StreamServer

# 说明: 导入其它模块

def tcp_handler(socket, address):

    timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

    print '%s client(%s) connectd to server.' % (timestamp, address)

    gevent.sleep(5)

    socket.close()

if __name__ == '__main__':

    host = ''

    port = 80

    server = StreamServer((host, port), tcp_handler)

    server.serve_forever()

2. gevent.server.DatagramServer类, 常用于创建异步UDP服务器

 

扩展服务:

1. gevent.server.pywsgi类, 可用于创建支持单向实时轮询服务器, 轮询(polling),浏览器定期发送Ajax请求,服务器收到请求后立马响应且关闭连接

优点: 后端程序编写比较容易

缺点: 请求中大半无用,浪费带宽和服务器资源

实例: 适用于小型应用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

#

# Authors: limanman

# OsChina: http://xmdevops.blog.51cto.com/

# Purpose:

#

"""

# 说明: 导入公共模块

import time

from gevent.pywsgi import WSGIServer

# 说明: 导入其它模块

def ajax_endpoint(environ, start_response):

    status = '200 OK'

    header = [

        ('Content-Type''text/html'),

        # 允许跨域

        ('Access-Control-Allow-Origin''*')

    ]

    start_response(status, header)

    return str(time.time())

if __name__ == '__main__':

    host = ''

    port = 80

    server = WSGIServer((host, port), ajax_endpoint)

    server.serve_forever()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<!DOCTYPE html>

<html lang="zh-en">

    <head>

        <meta charset="UTF-8">

        <title>polling</title>

        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>

    </head>

    <body>

    </body>

    <script type="text/javascript">

        setInterval(function () {

            $.ajax({

                url: 'http://127.0.0.1/',

                success:function (data) {

                    $('body').append('<p>' + data + '</p>')

                }

            })

        }, 1000)

    </script>

</html>

2. gevent.server.pywsgi类, 可用于创建支持单向实时长轮询服务器, 长轮询(long-polling),客户端向服务器发送Ajax请求,服务器收到请求后hold住连接,直到有消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求

优点: 在无消息的情况下不会频繁的请求,耗费资源小

缺点: 服务器hold连接会消耗资源,返回数据顺序无保证,难以管理维护

实例: WebQQ,Hi网页版,Facebook IM等

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

#

# Authors: limanman

# OsChina: http://xmdevops.blog.51cto.com/

# Purpose:

#

"""

# 说明: 导入公共模块

import time

import gevent

import itertools

from gevent.pywsgi import WSGIServer

from gevent.queue import Queue, Empty

# 说明: 导入其它模块

= Queue()

def generate_data():

    cycle = itertools.cycle(xrange(1101))

    while True:

        q.put_nowait(str(cycle.next()))

        gevent.sleep(5)

def ajax_endpoint(environ, start_response):

    status = '200 OK'

    header = [

        ('Content-Type''text/html'),

        # 允许跨域

        ('Access-Control-Allow-Origin''*')

    ]

    start_response(status, header)

    while True:

        try:

            yield q.get(timeout=1)

        except Empty, e:

            # 队列为空异常返回

            return

if __name__ == '__main__':

    host = ''

    port = 80

    = gevent.spawn(generate_data)

    g.start()

    server = WSGIServer((host, port), ajax_endpoint)

    server.serve_forever()

    g.join()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<!DOCTYPE html>

<html lang="zh-en">

    <head>

        <meta charset="UTF-8">

        <title>polling</title>

        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>

    </head>

    <body>

    </body>

    <script type="text/javascript">

        function longPolling() {

            $.ajax({

                url: 'http://127.0.0.1/',

                success:function (data) {

                    $('body').append('<p>' + data + '</p>')

                    if(data != '100') {

                        longPolling()

                    }

                }

            })

        }

        longPolling()

    </script>

</html>

说明: 长轮询和轮询的区别在于轮询每次由Ajax发出请求,服务端处理完毕返回响应后就结束了这条连接,而长轮询由Ajax发出请求,但是发出后会阻塞在那里等待回应,服务端只需要从数据源定期取数据就好,超时后会将之前yied的值一次性返回,本次连接断开,所以返回的数据顺序以及数量是不能保证的.

 

3. gevent.server.pywsgi+geventwebsocket(pip install gevent-websocket)类, 可用于创建支持双向实时WebSockets服务器,但并不是所有的浏览器都支持WebSockets,个人更推荐socket.io,由于它封装了WebSocket,且支持多种连接方式.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

#

# Authors: limanman

# OsChina: http://xmdevops.blog.51cto.com/

# Purpose:

#

"""

# 说明: 导入公共模块

import time

import gevent

from gevent.pywsgi import WSGIServer

from geventwebsocket import WebSocketError

from geventwebsocket.handler import WebSocketHandler

# 说明: 导入其它模块

def ws_handler(environ, start_response):

    ws = environ["wsgi.websocket"]

    while True:

        try:

            ws.send(str(time.time()))

            gevent.sleep(1)

        except WebSocketError, e:

            pass

if __name__ == '__main__':

    host = ''

    port = 5000

    server = WSGIServer((host, port), ws_handler, handler_class=WebSocketHandler)

    server.serve_forever()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<!DOCTYPE html>

<html lang="zh-en">

    <head>

        <meta charset="UTF-8">

        <title>polling</title>

        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>

    </head>

    <body>

        <div id="conn_status">Not Connected</div>

        <div id="placeholder" style="width:600px;height:300px;"></div>

    </body>

    <script type="text/javascript">

        $(function () {

            var ws = new WebSocket('ws://127.0.0.1:5000');

            ws.onmessage = function (event) {

                $('#placeholder ').append('<p>' + event.data + '</p>')

            }

            ws.onopen = function(event) {

                $('#conn_status').html('<b>Connected</b>');

            }

            ws.onerror = function(event) {

                $('#conn_status').html('<b>Error</b>');

            }

            ws.onclose = function(event) {

                $('#conn_status').html('<b>Closed</b>');

            }

        })

    </script>

</html>

说明: 利用gevent-websocket的WebSocketHandler处理类,在服务端调用send()/receive(),可以很方便的实现Websocket客户端与服务端的实时通信,不妨尝试来一发,运维利器网页版tail -f的Websocket实现?

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “满满李 - 运维开发之路” 博客,请务必保留此出处http://xmdevops.blog.51cto.com/11144840/1862737

© 著作权归作者所有

共有 人打赏支持
乐搏学院
粉丝 6
博文 526
码字总数 707467
作品 0
丰台
程序员
谁说gevent不能做web开发的?

fastpy是一个对gevent进行易用性封装的 高性能web框架, 其充分利用了gevent协程的特点,使得原本的mysql与http请求实现自动同步转异步。 从而达到使用简单但性能高效的特点。 源代码只有800...

feimat ⋅ 2016/03/16 ⋅ 0

新年新项目,聊一聊最近在做的 LightIO,IO 性能的免费午餐

LightIO 是什么 gevent 是 python 中我最喜欢库之一。 只要 import gevent, 调用下 monkey patch 便会把线程替换为绿色线程,并且把标准库 socket 打上补丁。 每次 IO 操作都会由类库自动切换...

jjym ⋅ 01/01 ⋅ 0

Flask+Gunicorn+Gevent+Supervisor+Nginx生产环境部署

老毛病了,在用某个新框架或新架构之前,总得花时间谷歌和自己折腾一番,才能知道这个框架和架构的优缺点,才会发现自己最喜欢、用的最顺手的的一种。近期在学习python,这里记录一下自己用的...

Jx战壕 ⋅ 2017/07/26 ⋅ 0

Python 开源异步并发框架的未来(转)

Python 开源异步并发框架的未来 fantix 1.1k 2014年04月16日 发布 推荐 4 推荐 收藏 31 收藏,8.9k 浏览 呵呵,这个标题有点大,其实只是想从零开始介绍一下异步的基础,以及 Python 开源异步...

greenblue ⋅ 2015/08/15 ⋅ 0

gevent-zookeeper for windows

最近尝试gevent+zookeeper组合,google找到gevent-zookeeper库(https://github.com/jrydberg/gevent-zookeeper),gevent-zookeeper库依赖zookeeper的python库,使用它的异步接口,实现和g...

seewind ⋅ 2012/04/16 ⋅ 2

python模块介绍-gevent介绍:基于协程的网络库

python模块介绍-gevent介绍:基于协程的网络库 介绍 gevent是基于协程的Python网络库。特点: 基于libev的快速事件循环(Linux上epoll,FreeBSD上kqueue)。 基于greenlet的轻量级执行单元。 ...

磁针石 ⋅ 2014/01/13 ⋅ 2

9miao.com/gfirefly

#gfirefly firefly-gevent 是firefly的gevent版本。相比现在的firefly版本使用的twisted,gevent更加的精简。 gevent就是一个基于coroutine的python网络开发框架。协程是一种并发模型,但不同...

9miao.com ⋅ 2014/03/07 ⋅ 0

【重要】基于Gevent的firefly重要迭代版本推出

目前使用者最多的开源游戏服务器端框架Firefly推出了基于Gevent的重要迭代版本,不过目前还处在alpha阶段。Firefly团队使用Gevent完整实现了之前Firefly所依赖twisted内的部分,并还原了api...

大鸡蛋 ⋅ 2014/03/20 ⋅ 6

Gevent: 优点,缺点,以及不优美的地方

原始出处: In the Milky way 我不想用很多时间去描述Gevent是什么,我想它官网上的一句总结足矣: “Gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的...

nardoo ⋅ 2014/07/15 ⋅ 0

Python gevent学习笔记 2

在上一篇里了解了gevent应用的IO模型概念之后,接下来开始真正了解gevent的使用。 Greenlet 在gevent里面最多应用到的就是greenlet,一个轻量级的协程实现。在任何时间点,只有一个greenlet处...

贱圣 ⋅ 2013/06/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sbt网络问题解决方案

http://dblab.xmu.edu.cn/blog/maven-network-problem/

狐狸老侠 ⋅ 6分钟前 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 50分钟前 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 55分钟前 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部