協程,又稱微線程,纖程。英文名Coroutine。gevent是一個基於協程的Python網絡庫服務器
協程的概念很早就提出來了,但直到最近幾年纔在某些語言(如Lua)中獲得普遍應用。網絡
子程序,或者稱爲函數,在全部語言中都是層級調用,好比A調用B,B在執行過程當中又調用了C,C執行完畢返回,B執行完畢返回,最後是A執行完畢。socket
因此子程序調用是經過棧實現的,一個線程就是執行一個子程序。函數
子程序調用老是一個入口,一次返回,調用順序是明確的。而協程的調用和子程序不一樣。spa
協程看上去也是子程序,但執行過程當中,在子程序內部可中斷,而後轉而執行別的子程序,在適當的時候再返回來接着執行。、線程
客戶端:code
import socket HOST = 'localhost' # The remote host PORT = 8701 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) while True: msg = bytes(input(">>:"), encoding="utf8") s.sendall(msg) data = s.recv(1024) # print('Received', data) s.close()
服務器端:server
import sys import socket import time import gevent from gevent import socket, monkey monkey.patch_all() def server(port): s = socket.socket() s.bind(('0.0.0.0', port)) s.listen(500) while True: cli, addr = s.accept() gevent.spawn(handle_request, cli) def handle_request(conn): try: while True: data = conn.recv(1024) print("recv:", data) conn.send(data) if not data: conn.shutdown(socket.SHUT_WR) except Exception as ex: print(ex) finally: conn.close() if __name__ == '__main__': server(8701)
執行效果:協程
服務器:blog
recv: b'47'
recv: b'414'
recv: b'11'
recv: b'2222'
客戶端1:
>>:47
Received b'47'
>>:11
Received b'11'
客戶端2:
>>:414Received b'414'>>:2222Received b'2222'