Python里執行并發有進程和線程兩個,分布使用?threading 和multiprocessing 兩個庫,一般用的是這兩個庫里的Thread和Process
from threading import Thread # 線程 : 同時運行from multiprocessing import Process # 進程
進程和線程的使用場景:
1. 一般在有大量的數據(耗時)操作的時候,會用到線程和進程
2.python里要優先用進程,因為Python里的線程有個自帶的bug,全局解釋器鎖
示例1:有大貓和小貓睡覺的兩個模擬耗時的操作,如果不用并發,執行效果就是從上到下順序 串行執行的
from threading import Thread # 線程 : 同時運行 import time, random# 模擬耗時操作:大貓和小貓睡覺 def daMaoSleep(n):print("大貓開始睡覺了,它要睡{}秒".format(n) )time.sleep(n)print("現在大貓睡醒了")def xiaoMaoSleep(n):print("小貓開始睡覺了,它要睡{}秒".format(n) )time.sleep(n)print("現在小貓睡醒了")if __name__ == '__main__':# 不適用線程和進程,是順序串行的n_da = random.randint(3,5)n_xiao = random.randint(3,6)# 使用線程庫進行并行,注意target是函數名,args是參數,參數必須是元組# target=傳參是要運行的函數,args=(n,) args是個元組,如果只有一個參數,要帶逗號的# 使用線程庫進行并行,注意target是函數名,args是參數,參數必須是元組# 執行大貓睡覺thread = Thread(target=daMaoSleep,args=(n_da,))thread.start()# 執行小貓睡覺thread = Thread(target=xiaoMaoSleep,args=(n_xiao,))thread.start()# 輸出 大貓開始睡覺了,它要睡4秒 小貓開始睡覺了,它要睡3秒 現在小貓睡醒了 現在大貓睡醒了
?
示例2:如果想讓大貓和小貓同時開始睡覺,怎么操作呢?
這里用線程的方式實現并發演示
from multiprocessing import Process # 進程 import time, random# 模擬耗時操作:大貓和小貓睡覺 def daMaoSleep(n):print("大貓開始睡覺了,它要睡{}秒".format(n) )time.sleep(n)print("現在大貓睡醒了")def xiaoMaoSleep(n):print("小貓開始睡覺了,它要睡{}秒".format(n) )time.sleep(n)print("現在小貓睡醒了")if __name__ == '__main__':n_da = random.randint(3,5)n_xiao = random.randint(3,6)# 使用進程庫進行并行,注意target是函數名,args是參數,參數必須是元組# target=傳參是要運行的函數,args=(n,) args是個元組,如果只有一個參數,要帶逗號的# 使用進程庫進行并行,注意target是函數名,args是參數,參數必須是元組# 執行大貓睡覺process = Process(target=daMaoSleep,args=(n_da,))process.start()# 執行小貓睡覺process = Process(target=xiaoMaoSleep,args=(n_xiao,))process.start()# 輸出 大貓開始睡覺了,它要睡4秒 小貓開始睡覺了,它要睡3秒 現在小貓睡醒了 現在大貓睡醒了
注意避免踩坑:進程和線程一定要寫在?if __name__ == '__main__' 里面的,否則會報錯
進程與線程的區別:
什么是進程,什么是線程
系統要做一件事,運行一個任務,所有運行的任務通常就是一個程序;
每個運行中的程序就是一個進程,這一點在任務管理器上面可以形象的看到。
當一個程序運行時,內部可能會包含多個順序執行流,每個順序執行流就是一個線程。
?
關于進程的特性
獨立性:進程是系統中獨立存在的實體,它可以擁有自己獨立的資源,每個進程都擁有自己私有的地址空間。在沒有經過進程本身運行的情況下是不能訪問其中的內容的。
動態性:進程與程序的區別在于,程序是靜態的,進程是動態的。程序只是一個靜態的指令集合,而進程是一個正在系統中運行的指令集合。有了時間的概念,如生命周期;
并發性:進程之間,交替著執行。
?
線程,一個順序執行流;
它是進程的組成部分,一個進程可以有多個線程。
?
關于線程的特性,或是它的優勢
1、進程之間不能共享內存,單線程之間共享內存非常的容易
2、系統創建進程需要為該進程重新分配系統資源,但創建線程的代價很小。因此多線程的實現多任務并發比多進程實現并發的效率高
3、java語言內置多線程功能支持,而不是單純的作為底層操作系統的調度方式
?
總結:
一個程序運行至少一個進程,一個進程里面至少包含一個線程,線程是進程的組成部分。
線程相對于進程而言,很強大了,做到了資源的共享,資源的損耗降低,人為的手工控制程序的運行。
?
多進程通信的方式有哪些?
1. 共享內存
2. 信號
3. 信號量
4. 管道
5. socket通信
多線程的通信方式有哪些?
因為線程運作在進程里里面,所以多線程的通信方式也就是多線程的通信方式
?
不過,總的來說,目前進程和線程已經過時了,當前主流的處理方式都用消息隊列實現
?
?
?