gpt4 book ai didi

Python的Tornado框架异步编程入门实例

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python的Tornado框架异步编程入门实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

Tornado 。

Tornado 是一款非阻塞可扩展的使用Python编写的web服务器和Python Web框架, 可以使用Tornado编写Web程序并不依赖任何web服务器直接提供高效的web服务.所以Tornado不仅仅是一个web框架而且还是一款可以用于生产环境的高效的web服务器 。

Torando 在Linux和FreeBSD上使用高效的异步I/O模型 epoll 和kqueue来实现高效的web服务器, 所以 tornado在Linux上和FreeBSD系列性能可以达到最高 接口 。

当然我们可以不仅仅把Tornado看作是一个web框架和web服务器, 我们可以利用Tornado提供的接口进行高效的网络异步编程.

tornado.ioloop.IOLoop 提供了三个接口可以用于网络编程

?
1
2
3
4
5
add_handler
 
def add_handler( self , fd, handler, events):
   self ._handlers[fd] = stack_context.wrap(handler)
   self ._impl.register(fd, events | self .ERROR)

add_handler用于添加socket到主循环中, 接受三个参数: fd 是socket的文件描述符 handler 是处理此socket的 callback函数 * events 是此socket注册的事件 。

?
1
2
3
4
update_handler
 
def update_handler( self , fd, events):
   self ._impl.modify(fd, events | self .ERROR)

update_handler用于更新住循环中已存在的socket响应事件, 接受两个参数: fd 是socket对应的文件描述符 events 是注册的新事件 。

?
1
2
3
4
5
6
7
8
9
remove_handler
 
def remove_handler( self , fd):
   self ._handlers.pop(fd, None )
   self ._events.pop(fd, None )
   try :
     self ._impl.unregister(fd)
   except Exception:
     gen_log.debug( "Error deleting fd from IOLoop" , exc_info = True )

remove_handler用于移除主循环中已存在的socket 事件 。

tornado.ioloop.IOLoop同时提供了4种响应事件


Python的Tornado框架异步编程入门实例

实例 。

根据上面的接口和事件我们就可以写出一个简单的 echo server 。

?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
#  Author :  cold
#  E-mail :  wh_linux@126.com
#  Date  :  13/04/15 15:08:51
#  Desc  :  Tornado Echo Server
#  HOME  :  http://www.linuxzen.com
#
import Queue
import socket
 
from functools import partial
 
from tornado.ioloop import IOLoop
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking( 0 )       # 将socket设置为非阻塞
 
server_address = ( "localhost" , 10000 )
 
sock.bind(server_address)
sock.listen( 5 )
 
fd_map = {}       # 文件描述符到socket的映射
message_queue_map = {}  # socket到消息队列的映射
 
fd = sock.fileno()
fd_map[fd] = sock
 
ioloop = IOLoop.instance()
 
def handle_client(cli_addr, fd, event):
   s = fd_map[fd]
   if event & IOLoop.READ:
     data = s.recv( 1024 )
     if data:
       print "   received '%s' from %s" % (data, cli_addr)
       # 接收到消息更改事件为写, 用于发送数据到对端
       ioloop.update_handler(fd, IOLoop.WRITE)
       message_queue_map[s].put(data)
     else :
       print "   closing %s" % cli_addr
       ioloop.remove_handler(fd)
       s.close()
       del message_queue_map[s]
 
   if event & IOLoop.WRITE:
     try :
       next_msg = message_queue_map[s].get_nowait()
     except Queue.Empty:
       print "%s queue empty" % cli_addr
       ioloop.update_handler(fd, IOLoop.READ)
     else :
       print 'sending "%s" to %s' % (next_msg, cli_addr)
       s.send(next_msg)
 
   if event & IOLoop.ERROR:
     print " exception on %s" % cli_addr
     ioloop.remove_handler(fd)
     s.close()
     del message_queue_map[s]
 
 
def handle_server(fd, event):
   s = fd_map[fd]
   if event & IOLoop.READ:
     conn, cli_addr = s.accept()
     print "   connection %s" % cli_addr[ 0 ]
     conn.setblocking( 0 )
     conn_fd = conn.fileno()
     fd_map[conn_fd] = conn
     handle = partial(handle_client, cli_addr[ 0 ])  # 将cli_addr作为第一个参数
     # 将连接和handle注册为读事件加入到 tornado ioloop
     ioloop.add_handler(conn_fd, handle, IOLoop.READ)
     message_queue_map[conn] = Queue.Queue()  # 创建对应的消息队列
 
 
ioloop.add_handler(fd, handle_server, IOLoop.READ)
 
ioloop.start()

上面代码就建立了一个非阻塞的高效的异步的echo server 。

最后此篇关于Python的Tornado框架异步编程入门实例的文章就讲到这里了,如果你想了解更多关于Python的Tornado框架异步编程入门实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com