1. 程式人生 > >python的多執行緒和多程序

python的多執行緒和多程序

要使用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