国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python的Tornado框架異步編程入門實例

2020-02-23 00:51:15
字體:
來源:轉載
供稿:網友

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 提供了三個接口可以用于網絡編程:

add_handlerdef 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注冊的事件

update_handlerdef update_handler(self, fd, events):  self._impl.modify(fd, events | self.ERROR)

update_handler用于更新住循環中已存在的socket響應事件, 接受兩個參數: fd 是socket對應的文件描述符 events 是注冊的新事件

remove_handlerdef 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種響應事件:
201542494640809.jpg (391×210)

實例

根據上面的接口和事件我們就可以寫出一個簡單的 echo server

#!/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 Queueimport socketfrom functools import partialfrom tornado.ioloop import IOLoopsock = 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] = sockioloop = 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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大竹县| 宜宾县| 青浦区| 繁昌县| 思南县| 东阿县| 舞阳县| 靖州| 乌拉特前旗| 施秉县| 扶余县| 定远县| 平度市| 枞阳县| 沙雅县| 柯坪县| 浦县| 榆社县| 汨罗市| 灵武市| 株洲县| 扎囊县| 东丰县| 谷城县| 韩城市| 大名县| 双辽市| 霍州市| 华亭县| 图片| 芷江| 始兴县| 建平县| 台南市| 蒲城县| 左权县| 河西区| 河西区| 彝良县| 平武县| 社旗县|