python多進程單線程+協程實現高併發

併發:看起來像同時運行就是併發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第一次執行完一次到下一次完整執行完一次的時間較長,那麼這樣的併發其實並無多大的參考價值。

 

 

給個讚唄~

相關文章
相關標籤/搜索