python的多線程和多進程
阿新 • • 發佈:2018-12-31
listen 需要 color target 使用 *** 情況下 end ==
要使用Python的多線程,首先要了解一個概念。GIL(global interpreter lock),翻譯過來就是以解釋器為單位的全局鎖。
用過線程鎖的都知道,LOCK就是用來管理住線程,讓一個指定的線程先運行,其他的先暫停(等待),避免線程的混亂,尤其是在共用變量的情況下。
GIL也是一樣的概念,但是不同的是:
1.你可以想成他是解釋器控制的
2.線程的指定是隨機的
3.每個線程acquire運行機會後,可運行的內容很少(因此線程間的切換超級快)
因此,多線程看起來好像是多個線程一起運行,實際上也是大家輪流。比起單線程,他還多了一個線程切換的開銷,因此執行效率上,很多時候是不如單線程的。
那多線程有什麽用的,我認為在以下及方面,還是用多線程比較有效率:
1.單線程只能根據順序一行行從上往下執行。那你想一遍操作前臺,一邊後臺記錄日誌的時候,就需要用到多線程。或者你想一邊運行腳本,一邊等待指令來停止腳步的時候,也需要多線程。
2.對於IO密集型的線程,多線程則可以提高效率。例如下面的例子,線程向服務器發送信息,服務器接收後等待5s再返回給線程。如果用單線程的方式,則一共要等待10s
from client import send_and_receive def main(): start_time = time.time() for i in [40080,40081]: t= Thread(target=send_and_receive, args=(i,)) t.start() t.join() end_time = time.time() print("Total time: {}".format(end_time - start_time)) if __name__ == ‘__main__‘: main()
而使用多線程的方式,則一共只要等待5左右s,因為這個等待是同步的
from client import send_and_receive def main(): start_time= time.time() for i in [40080,40081]: t = Thread(target=send_and_receive,args=(i,)) t.start() t.join() end_time = time.time() print("Total time: {}".format(end_time - start_time)) if __name__ == ‘__main__‘: main()
****************************client**********************
import socket def send_and_receive(port): s_obj=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s_obj.connect((‘localhost‘,port)) s_obj.send(‘x‘) while True: buf=s_obj.recv(1024) if buf!=‘‘: return buf
****************************server**********************
#為更準確的統計時間,服務器寫了2個不同端口的,而不是在服務器中使用線程
import socket import time s_obj=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s_obj.bind((‘localhost‘,40080)) s_obj.listen(5) while True: conn,ipaddr=s_obj.accept() while True: if conn.recv(1024)!=‘‘: time.sleep(5) print ‘send back‘ conn.send(‘back‘) conn.close() break
python的多線程和多進程