<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        Python基于Socket實現(xiàn)異步非阻塞

        來源:懂視網(wǎng) 責(zé)編:小OO 時間:2020-11-27 14:24:24
        文檔

        Python基于Socket實現(xiàn)異步非阻塞

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

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

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

        一、源碼

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

        #!/usr/bin/env python
        # -*- coding:utf-8 -*-
        import re
        import socket
        import select
        import time
        class HttpResponse(object):
         """
         封裝響應(yīng)信息
         """
         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):
         """
         異步非阻塞模式時封裝回調(diào)函數(shù)以及是否準(zhǔn)備就緒
         """
         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):
         """
         事件循環(huán)
         :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):
         """
         遍歷觸發(fā)異步非阻塞的回調(diào)函數(shù)
         :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):
         """
         處理路由系統(tǒng)以及執(zhí)行函數(shù)
         :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)

        【相關(guān)推薦】

        1. Python免費視頻教程

        2. Python學(xué)習(xí)手冊

        3. Python面向?qū)ο笠曨l教程

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

        文檔

        Python基于Socket實現(xiàn)異步非阻塞

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费国内精品久久久久影院| 国产V亚洲V天堂无码| 免费看污成人午夜网站| 日韩免费视频网站| 亚洲日产无码中文字幕| 亚洲国产精品一区二区三区在线观看 | 日韩一区二区a片免费观看| 四虎在线播放免费永久视频| 国产亚洲人成网站在线观看| 亚洲大尺码专区影院| 又黄又大的激情视频在线观看免费视频社区在线| 99久久久国产精品免费牛牛四川| 亚洲AⅤ永久无码精品AA| 亚洲明星合成图综合区在线| 亚洲大片免费观看| 国产传媒在线观看视频免费观看| 亚洲成AV人影片在线观看| 99re在线免费视频| 亚洲国产精品yw在线观看| 国产免费无码AV片在线观看不卡| 国产jizzjizz视频全部免费| 水蜜桃视频在线观看免费| 成人免费毛片视频| 亚洲欧洲日韩综合| 拨牐拨牐x8免费| 亚洲AV无码一区二区三区鸳鸯影院 | 免费毛片在线播放| 亚洲美女免费视频| 久久久精品免费国产四虎| 亚洲人成依人成综合网| g0g0人体全免费高清大胆视频| 日本不卡在线观看免费v| 朝桐光亚洲专区在线中文字幕| 日韩一卡2卡3卡4卡新区亚洲| 免费无遮挡无遮羞在线看| 亚洲国产精品嫩草影院在线观看 | 中文字幕成人免费高清在线视频| 国产精品色午夜免费视频 | 久久亚洲精品中文字幕三区| 久久国产乱子伦精品免费不卡| 亚洲综合伊人久久大杳蕉|