協程緩存
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)