2019独角兽企业重金招聘Python工程师标准>>>

内置服务:

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

转载于:https://my.oschina.net/learnbo/blog/845667

Gevent异步服务类实现多姿势WEB实时展示相关推荐

  1. 基础入门_Python-模块和包.Gevent异步服务类实现多姿势WEB实时展示?

    内置服务: 1. gevent.server.StreamServer类, 常用于创建异步TCP服务器 #!/usr/bin/env python # -*- coding: utf-8 -*- &q ...

  2. 终于实现Web实时推送啦!

    需要完成的需求: 定时推送一条消息到客户端,如果用户接收到了该条消息则给服务器一个反馈.且显示每条消息的到达率. 用到的第三方服务: GoEasy推送 JAVA Web实时消息后台服务器推送技术 实现 ...

  3. ASP.NET Core环境Web Audio API+SingalR+微软语音服务实现web实时语音识别

    处于项目需要,我研究了一下web端的语音识别实现.目前市场上语音服务已经非常成熟了,国内的科大讯飞或是国外的微软在这块都可以提供足够优质的服务,对于我们工程应用来说只需要花钱调用接口就行了,难点在于整 ...

  4. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务) 一.大致介绍 微服务与微服务之间通过 ...

  5. Spring容器装饰者模式应用之实现业务类与服务类自由组合的解决方式

    在不论什么一个项目中都不可或缺的存在两种bean,一种是实现系统核心功能的bean,我们称之为业务类,第二种是与系统核心业务无关但同一时候又提供十分重要服务bean,我们称之为服务类.业务类的bean ...

  6. 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)

    引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https://www.microsoft.com/ne ...

  7. AngularJS 的异步服务测试与Mocking

    测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...

  8. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...

  9. 阿翔编程学-Axis日志服务类

    阿翔编程学-Axis日志服务类 //=========================================================== //日志服务类程序 author:曹翔 // ...

最新文章

  1. python爬取站长素材网页图片保存到ppt中
  2. 远程登录的机器不是域控制器的方法
  3. [转]Android有效解决加载大图片时内存溢出的问题
  4. shedlock mysql_ShedLock日常使用
  5. centos6.8安装oracle12C 详细步骤讲解
  6. [源码和文档分享]基于JAVA的即时通信软件
  7. 70 行 Go 代码打败 C!
  8. 数据库的主键与外键的区别
  9. Pulseaudio调用alsalib write()流程(十六)
  10. mpacc和计算机硕士,考MPAcc还是工作?读研三年VS工作三年对比!
  11. 放弃微博,继续回来写月经
  12. Linux 查看本机串口方法
  13. 蓝牙版本avrcp怎么选_干货|蓝牙网关是什么?蓝牙网关怎么用?蓝牙网关怎么选?...
  14. 反编译工具jd-gui、luyten学习使用
  15. IDEA2022 提示:更新 TKK 失败,请检查网络连接
  16. 15.(cesium之家)cesium暗色系地图样式地图(滤镜实现,反色滤镜)
  17. 微众税银首席风险官许卫 :AI在金融风控领域的实践应用
  18. CSS进阶-Less
  19. linux man 路径,Linux中.man文件用法【转】
  20. AD9的PCB技巧——批量修改封装

热门文章

  1. 虚拟局域网vlan实验报告_网络交换机如何规划,VLAN原理介绍
  2. 为什么铝基板无线接受电路板将信号源烧了?
  3. RT-Thread逐飞-智能车培训之RT-Thread在全向行进组中的应用
  4. 多股Litz线制作无线耦合线圈测试
  5. 将扫描字符转换成点阵信息
  6. 如何快速优雅的在CSDN输入公式?
  7. java jdbc效率_Java JDBC效率:连接需要多长时间?
  8. java maven 开发环境_Maven 搭建开发环境
  9. bigdecimal正确用法_深入理解 BigDecimal 的使用
  10. 计算机科学与技术第6次上机实验报告,计算机科学与技术第次实验报告-20210602214116.docx-原创力文档...