協程和IO模型

協程緩存

1.什麼是協程網絡

         單線程實現併發併發

         在應用程序裏控制多個任務的切換+保存狀態app

         優勢:socket

                  應用程序級別速度要遠遠高於操做系統的切換spa

         缺點:操作系統

                  多個任務一旦有一個阻塞沒有切,整個線程都阻塞在原地線程

                  該線程內的其餘的任務都不能執行了code

                  一旦引入協程,就須要檢測單線程下全部的IO行爲,實現遇到IO就切換,少一個         都不行,由於一旦一個任務阻塞了,整個線程就阻塞了,其餘的任務即使是能夠計算,         可是也沒法運行了server

 

2.協程的目的:

         想要在單線程下實現併發

         併發指的是多個任務看起來是同時運行的

         併發 = 切換+保存狀態

 

3.協程的應用

from gevent import monkey,spawn;monkey.patch_all()
from threading import current_thread
import time

def eat():
    print('%s eat 1' %current_thread().name)
    time.sleep(3)
    print('%s eat 2' %current_thread().name)

def play():
    print('%s play 1' %current_thread().name)
    time.sleep(1)
    print('%s play 2' %current_thread().name)

g1=spawn(eat,)
g2=spawn(play,)

print(current_thread().name)
g1.join()
g2.join()

IO模型

         recvfrom:

                  wait data:等待客戶端產生數據-->客戶端OS-->網絡-->服務端操做系統

                  copy data:由本地操做系統緩存中的數據拷貝到應用程序的內存中

         send:

                  copy data

 

非阻塞io模型

import socket

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)


conn_list = []
while True:
    try:
        print('當前鏈接數%s'%len(conn_list))
        conn,client_addr = server.accept()
        conn_list.append(conn)
        print('鏈接成功')
    except BlockingIOError:
        del_conn = []
        for i in conn_list:
            try:
                msg = i.recv(1024)
                if len(msg) == 0:
                    del_conn.append(i)
                    continue
                i.send(msg.upper())
            except BlockingIOError:
                pass
            except ConnectionResetError:
                del_conn.append(i)
        for i in del_conn:
            conn_list.remove(i)
相關文章
相關標籤/搜索