日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第九篇 并发(进程和线程)

發布時間:2023/11/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第九篇 并发(进程和线程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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通信

多線程的通信方式有哪些?
因為線程運作在進程里里面,所以多線程的通信方式也就是多線程的通信方式

?

不過,總的來說,目前進程和線程已經過時了,當前主流的處理方式都用消息隊列實現

?

?

?

轉載于:https://www.cnblogs.com/victorm/p/11326366.html

總結

以上是生活随笔為你收集整理的第九篇 并发(进程和线程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。