激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python的Tornado框架異步編程入門實(shí)例

Python的Tornado框架異步編程入門實(shí)例

2020-06-12 10:03C Wong Python

這篇文章主要介紹了Python的Tornado框架異步編程入門實(shí)例,異步編程的思維與普通編程比起來有些不同,需要的朋友可以參考下

Tornado

Tornado 是一款非阻塞可擴(kuò)展的使用Python編寫的web服務(wù)器和Python Web框架, 可以使用Tornado編寫Web程序并不依賴任何web服務(wù)器直接提供高效的web服務(wù).所以Tornado不僅僅是一個web框架而且還是一款可以用于生產(chǎn)環(huán)境的高效的web服務(wù)器

Torando 在Linux和FreeBSD上使用高效的異步I/O模型 epoll 和kqueue來實(shí)現(xiàn)高效的web服務(wù)器, 所以 tornado在Linux上和FreeBSD系列性能可以達(dá)到最高
接口

當(dāng)然我們可以不僅僅把Tornado看作是一個web框架和web服務(wù)器, 我們可以利用Tornado提供的接口進(jìn)行高效的網(wǎng)絡(luò)異步編程,

tornado.ioloop.IOLoop 提供了三個接口可以用于網(wǎng)絡(luò)編程:

?
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到主循環(huán)中, 接受三個參數(shù): fd 是socket的文件描述符 handler 是處理此socket的 callback函數(shù) * events 是此socket注冊的事件

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

update_handler用于更新住循環(huán)中已存在的socket響應(yīng)事件, 接受兩個參數(shù): fd 是socket對應(yīng)的文件描述符 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用于移除主循環(huán)中已存在的socket
事件

tornado.ioloop.IOLoop同時提供了4種響應(yīng)事件:


Python的Tornado框架異步編程入門實(shí)例

實(shí)例

根據(jù)上面的接口和事件我們就可以寫出一個簡單的 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 :  [email protected]
#  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設(shè)置為非阻塞
 
server_address = ("localhost", 10000)
 
sock.bind(server_address)
sock.listen(5)
 
fd_map = {}       # 文件描述符到socket的映射
message_queue_map = {}  # socket到消息隊(duì)列的映射
 
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)
      # 接收到消息更改事件為寫, 用于發(fā)送數(shù)據(jù)到對端
      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作為第一個參數(shù)
    # 將連接和handle注冊為讀事件加入到 tornado ioloop
    ioloop.add_handler(conn_fd, handle, IOLoop.READ)
    message_queue_map[conn] = Queue.Queue()  # 創(chuàng)建對應(yīng)的消息隊(duì)列
 
 
ioloop.add_handler(fd, handle_server, IOLoop.READ)
 
ioloop.start()

上面代碼就建立了一個非阻塞的高效的異步的echo server

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 快播av在线 | 毛片118极品美女写真 | 国产成人自拍视频在线观看 | 亚洲99影视一区二区三区 | 4p一女两男做爰在线观看 | 亚洲成人中文字幕在线 | 亚洲最大的成人网 | 日夜操天天干 | 成人一区二区三区在线 | 国产精品自在线拍 | 视频一区 中文字幕 | 成人午夜精品 | 黄色大片高清 | 精品国产一区二区三区久久久 | 精品国产91久久久久久久妲己 | 久久精品99北条麻妃 | hdbbwsexvideo| 在线中文日韩 | 久久精品在这里 | 999久久国产 | 国产在线区 | 日本一道aⅴ不卡免费播放 久久久久久久高清 | 久久免费综合视频 | 国产午夜亚洲精品午夜鲁丝片 | 精品一二三区视频 | 特黄一区二区三区 | 污片在线观看视频 | 99最新网址| 在线观看国产日韩 | 国产亚洲精品网站 | 久久av免费观看 | 天天草夜夜| 他也色在线视频 | 国产精品一区视频 | 久久免费视频精品 | 日韩欧美动作影片 | 今井夏帆av一区二区 | 99久久精约久久久久久清纯 | 欧美18—19sex性护士中国 | 欧美日韩在线视频一区 | 中文在线观看免费视频 |