併發:看起來像同時運行就是併發python
並行:同一時間同時被執行叫作並行,最大並行數就是CPU核數程序員
協程不是實實在在存在的物理基礎和操做系統運行邏輯,只是程序員從代碼層面避開了系統對遇到IO的程序會切走CPU資源的一種方法,在IO密集型任務中,經過協程,可讓CPU儘量多的時間在本程序上執行,因爲協程的原理是遇到IO及讓cpu去執行其餘代碼,不停的來回切,在基於socket TCP通訊中,這便爲併發提供了土壤,使得單線程也能實現併發多線程
下面咱們就來看下如何經過服務端開多線程和協程實現高併發併發
服務端:socket
import socket from multiprocessing import Process,current_process from gevent import monkey;monkey.patch_all() from gevent import spawn def frist(): s = spawn(task) # 遇到IO即切走執行其餘線程 s.join() # 等待spawn走完再往下走 def task(): server = socket.socket() server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) IP_port = ("127.0.0.1",52334) server.bind(IP_port) server.listen(5) while True: con, addr = server.accept() print(addr,"已鏈接") spawn(union,con) def union(con): while True: try: msg = con.recv(1024) print(msg.decode("utf-8")) con.send(msg.upper()) except BaseException: break con.close() if __name__ == '__main__': for i in range(1,50): p = Process(target=frist) # 開啓50個進程 p.start()
每個進程都會在accept()和recv()處來回切換執行並死循環,這已經能夠抗住必定的併發量高併發
而後開啓了49個進程,也就是說複製了以上的49份執行單位,可想而知單臺計算機可抗併發已經很是充分的利用到了cpu資源spa
下面看客戶端代碼:操作系統
import socket from threading import Thread,current_thread def task(): client = socket.socket() IP_port = ("192.168.11.161", 52334) client.connect(IP_port) while True: try: msg = current_thread() client.send(str(msg).encode("utf-8")) a = client.recv(1024) print("a",a.decode("utf-8")) except BaseException: break client.close() if __name__ == '__main__': for i in range(1,2000): s = Thread(target=task) s.start()
客戶端開啓了2000個線程模擬高併發,因爲Cpython有全局解釋器鎖,這決定了同一進程的全部線程在同一時間只能有1個線程在用CPU資源,這雖然下降了每一個線程的執行頻率,線程
但對於計算機來講,2000個執行完仍是很是快的,模擬併發徹底能夠。code
在以上的例子中,併發的效果並不能簡單的看客戶端訪問量,而應該關注客戶端每個線程訪問兩個週期間間隔的時長,若是線程1第一次執行完一次到下一次完整執行完一次的時間較長,那麼這樣的併發其實並無多大的參考價值。
給個讚唄~