python的多執行緒和多程序
阿新 • • 發佈:2018-12-31
要使用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() fori 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_receivedef 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