使用python實現多線程:
首先python的多線程是一種假的多線程;
以下是線程,進程的一些定義:
線程的簡要定義是:線程都是作爲利用CPU的基本單位,可併發執行,可以是程序中一個獨立運行的片段,是花費最小開銷的實體。
進程的簡要定義是:進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。
多線程的簡要定義是:多個線程併發執行的技術。
多進程的簡要定義是:一個父進程創建了幾個子進程(相當於一個兩個沒啥關係的python程序合到一個python文件中)
可以用生物學上的作爲類比:比如人體的各種器官同時工作才能維持人體的穩定,可以類比爲多進程處理不同的事情,以這次新型冠狀病毒爲例,進程類比爲免疫器官,而線程就是各種免疫細胞,進程的目的是爲了消滅病毒,就申請了很多的能量和物質用,真正用這些能量和物質的就是線程,比如一堆的白細胞去追殺病毒,用的是進程申請的資源,處理的是進程的事情,多個白細胞同時工作可以類比爲多線程。
注意:線程是異步的,所以類比起來比較奇怪的,你想想,一個白細胞剛剛準備吞一個病毒,結果上面說你先暫停,另一個白細胞準備去死了。。。
以下是python2相關例程:
多進程:
import multiprocessing
# 子進程1
def multiProc1(number):
time.sleep(3)
print(number)
# 子進程2
def multiProc2(number):
print(number)
# 父進程
def mainProc():
print("Welcome!!!")
# 啓動兩個進程(兩個同時運行,不用等待結束後再啓動下一個)
p = multiprocessing.Process(target=multiProc1,args =(1))
print('Child process multiProc1 will start.')
p.start()
p = multiprocessing.Process(target=multiProc1,args =(2))
print('Child process multiProc1 will start.')
p.start()
if __name__ == '__main__':
mainProc()
多進程(用的比較多的就是這個socket):
服務端:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
import threading
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome_To_Join_The_Conference') # 發送歡迎信息
while True:
data = sock.recv(1024) # 接收客戶端信息
if not data or data.decode('utf-8') == 'exit':
break
# 關閉連接
sock.close()
print('Connection from %s:%s closed.' % addr)
def startServer():
# 配置服務端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.0.102' # 配置服務器IP地址
port = 8888 # 配置服務器端口號(使用1025~65535端口號)
# 綁定端口
try:
s.bind((host, port)) # 綁定端口
print("Server started successfully !")
except OSError:
return False
s.listen(5)
print('Waiting for connection...')
# 啓動多線程,等待客戶端連接
while True:
sock, addr = s.accept()
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
if __name__ == '__main__':
startServer()
客戶端(多運行幾個客戶端就可以體會到多線程的含義):
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import socket
def connectServer():
try:
# 配置客戶端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '192.168.0.102' # 配置服務器IP地址
print('Current computer IP address:' + host)
port = 8888 # 配置服務器端口號(使用1025~65535端口號)
# 連接服務端
s.connect((host, port))
data = s.recv(1024).decode('utf-8') # 接收歡迎信息
print(data)
s.send(b'Welcome_To_Join_The_Conference') # 發送消息到服務端
except Exception,err:
print(err)
finally:
s.send(b'exit')
s.close()
if __name__ == '__main__':
connectServer()
爲什麼說這個python的多線程是假的多線程呢?
因爲全局解釋器鎖的問題,說白話點就是現在的處理器大都是多核的,但是python多線程佔用永遠只有一個核,也就是說你是一個八核處理器,你可以用python寫八個個死循環的線程,你就會發現這個cpu佔用率永遠只有大概12.5%左右,但是像c語言這種寫的多線程,可以搞到100%,想要python的程序也能100%的佔用,你試試把八個死循環線程換成多進程。