1. 程式人生 > >python的多線程和多進程

python的多線程和多進程

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的多線程和多進程