做爰高潮a片〈毛片〉,尤物av天堂一区二区在线观看,一本久久A久久精品VR综合,添女人荫蒂全部过程av

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Python基于Socket實現異步非阻塞

來源:懂視網 責編:小OO 時間:2020-11-27 14:24:24
文檔

Python基于Socket實現異步非阻塞

Python的Web框架中Tornado以異步非阻塞而聞名。本篇將使用200行代碼完成一個微型異步非阻塞Web框架:Snow。一、源碼;本文基于非阻塞的Socket以及IO多路復用從而實現異步非阻塞的Web框架,其中便是眾多異步非阻塞Web框架內部原理。
推薦度:
導讀Python的Web框架中Tornado以異步非阻塞而聞名。本篇將使用200行代碼完成一個微型異步非阻塞Web框架:Snow。一、源碼;本文基于非阻塞的Socket以及IO多路復用從而實現異步非阻塞的Web框架,其中便是眾多異步非阻塞Web框架內部原理。

本篇將使用200行代碼完成一個微型異步非阻塞Web框架:Snow。具有很好的參考價值,下面跟著小編一起來看下吧

Python的Web框架中Tornado以異步非阻塞而聞名。本篇將使用200行代碼完成一個微型異步非阻塞Web框架:Snow。

一、源碼

本文基于非阻塞的Socket以及IO多路復用從而實現異步非阻塞的Web框架,其中便是眾多異步非阻塞Web框架內部原理。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
import socket
import select
import time
class HttpResponse(object):
 """
 封裝響應信息
 """
 def init(self, content=''):
 self.content = content
 self.headers = {}
 self.cookies = {}
 def response(self):
 return bytes(self.content, encoding='utf-8')
class HttpNotFound(HttpResponse):
 """
 404時的錯誤提示
 """
 def init(self):
 super(HttpNotFound, self).init('404 Not Found')
class HttpRequest(object):
 """
 用戶封裝用戶請求信息
 """
 def init(self, conn):
 self.conn = conn
 self.header_bytes = bytes()
 self.header_dict = {}
 self.body_bytes = bytes()
 self.method = ""
 self.url = ""
 self.protocol = ""
 self.initialize()
 self.initialize_headers()
 def initialize(self):
 header_flag = False
 while True:
 try:
 received = self.conn.recv(8096)
 except Exception as e:
 received = None
 if not received:
 break
 if header_flag:
 self.body_bytes += received
 continue
 temp = received.split(b'

', 1)
 if len(temp) == 1:
 self.header_bytes += temp
 else:
 h, b = temp
 self.header_bytes += h
 self.body_bytes += b
 header_flag = True
 @property
 def header_str(self):
 return str(self.header_bytes, encoding='utf-8')
 def initialize_headers(self):
 headers = self.header_str.split('
')
 first_line = headers[0].split(' ')
 if len(first_line) == 3:
 self.method, self.url, self.protocol = headers[0].split(' ')
 for line in headers:
 kv = line.split(':')
 if len(kv) == 2:
 k, v = kv
 self.header_dict[k] = v
class Future(object):
 """
 異步非阻塞模式時封裝回調函數以及是否準備就緒
 """
 def init(self, callback):
 self.callback = callback
 self._ready = False
 self.value = None
 def set_result(self, value=None):
 self.value = value
 self._ready = True
 @property
 def ready(self):
 return self._ready
class TimeoutFuture(Future):
 """
 異步非阻塞超時
 """
 def init(self, timeout):
 super(TimeoutFuture, self).init(callback=None)
 self.timeout = timeout
 self.start_time = time.time()
 @property
 def ready(self):
 current_time = time.time()
 if current_time > self.start_time + self.timeout:
 self._ready = True
 return self._ready
class Snow(object):
 """
 微型Web框架類
 """
 def init(self, routes):
 self.routes = routes
 self.inputs = set()
 self.request = None
 self.async_request_handler = {}
 def run(self, host='localhost', port=9999):
 """
 事件循環
 :param host:
 :param port:
 :return:
 """
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 sock.bind((host, port,))
 sock.setblocking(False)
 sock.listen(128)
 sock.setblocking(0)
 self.inputs.add(sock)
 try:
 while True:
 readable_list, writeable_list, error_list = select.select(self.inputs, [], self.inputs,0.005)
 for conn in readable_list:
 if sock == conn:
 client, address = conn.accept()
 client.setblocking(False)
 self.inputs.add(client)
 else:
 gen = self.process(conn)
 if isinstance(gen, HttpResponse):
 conn.sendall(gen.response())
 self.inputs.remove(conn)
 conn.close()
 else:
 yielded = next(gen)
self.async_request_handler[conn] = yielded
 self.polling_callback()
except Exception as e:
 pass
 finally:
 sock.close()
def polling_callback(self):
 """
 遍歷觸發異步非阻塞的回調函數
 :return:
 """
 for conn in list(self.async_request_handler.keys()):
 yielded = self.async_request_handler[conn]
 if not yielded.ready:
 continue
 if yielded.callback:
 ret = yielded.callback(self.request, yielded)
 conn.sendall(ret.response())
 self.inputs.remove(conn)
 del self.async_request_handler[conn]
 conn.close()
 def process(self, conn):
 """
 處理路由系統以及執行函數
 :param conn:
 :return:
 """
 self.request = HttpRequest(conn)
 func = None
 for route in self.routes:
 if re.match(route[0], self.request.url):
 func = route[1]
 break
 if not func:
 return HttpNotFound()
 else:
 return func(self.request)
snow.py

二、使用

1. 基本使用

from snow import Snow
from snow import HttpResponse
def index(request):
return HttpResponse('OK')
routes = [
 (r'/index/', index),
]
app = Snow(routes)
app.run(port=8012)

2.異步非阻塞:超時

from snow import Snow
from snow import HttpResponse
from snow import TimeoutFuture
request_list = []
def async(request):
 obj = TimeoutFuture(5)
 yield obj
def home(request):
 return HttpResponse('home')
routes = [
 (r'/home/', home),
 (r'/async/', async),
]
app = Snow(routes)
app.run(port=8012)

3.異步非阻塞:等待

基于等待模式可以完成自定制操作

from snow import Snow
from snow import HttpResponse
from snow import Future
request_list = []
def callback(request, future):
 return HttpResponse(future.value)
def req(request):
 obj = Future(callback=callback)
 request_list.append(obj)
 yield obj
def stop(request):
 obj = request_list[0]
 del request_list[0]
 obj.set_result('done')
 return HttpResponse('stop')
routes = [
 (r'/req/', req),
 (r'/stop/', stop),
]
app = Snow(routes)
app.run(port=8012)

【相關推薦】

1. Python免費視頻教程

2. Python學習手冊

3. Python面向對象視頻教程

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Python基于Socket實現異步非阻塞

Python的Web框架中Tornado以異步非阻塞而聞名。本篇將使用200行代碼完成一個微型異步非阻塞Web框架:Snow。一、源碼;本文基于非阻塞的Socket以及IO多路復用從而實現異步非阻塞的Web框架,其中便是眾多異步非阻塞Web框架內部原理。
推薦度:
標簽: 實現 python socket
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 科技| 中江县| 湟源县| 阿拉善左旗| 紫阳县| 开封县| 乾安县| 敦化市| 昆山市| 迁西县| 南康市| 葵青区| 长宁区| 青川县| 江北区| 东辽县| 乐安县| 腾冲县| 阿荣旗| 涞源县| 分宜县| 恩平市| 贞丰县| 应用必备| 遂平县| 奉节县| 隆子县| 海宁市| 福建省| 利津县| 新民市| 嫩江县| 中方县| 咸丰县| 赫章县| 肃宁县| 普陀区| 姜堰市| 江陵县| 华安县| 黄大仙区|