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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python进程、线程的学习心得

發(fā)布時(shí)間:2025/5/22 python 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python进程、线程的学习心得 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是多線程競(jìng)爭(zhēng)?

線程不是獨(dú)立的,同一個(gè)進(jìn)程里的線程,線程間的數(shù)據(jù)是共享的,多線程操作時(shí),容易造成數(shù)據(jù)的混亂,線程不安全。

如何解決?

互斥鎖。

好處:能夠保證某段關(guān)鍵代碼執(zhí)行時(shí),只有一個(gè)線程操作,保證原子性,避免多線程下的資源競(jìng)爭(zhēng)。

壞處:性能下降,阻止了多線程的并發(fā)執(zhí)行。致命問(wèn)題,有可能產(chǎn)生死鎖。

解釋一下什么是鎖,有哪幾種鎖?

鎖是python提供的對(duì)線程控制的對(duì)象。互斥鎖,可重入鎖,死鎖。

互斥鎖:同一時(shí)刻只允許一個(gè)線程操作,具有排他性和唯一性。比如A、B兩個(gè)線程,A操作時(shí),B只能等著,A執(zhí)行完,B才能操作。

可重入鎖:有時(shí)候在同一個(gè)線程中,我們可能會(huì)多次請(qǐng)求同一資源(就是,獲取同一鎖鑰匙),俗稱鎖嵌套。

死鎖:互相干等著,都不釋放鎖,程序無(wú)法執(zhí)行下去。

GIL鎖(全局解釋器鎖):限制多線程的同時(shí)執(zhí)行,同一時(shí)間,只有一個(gè)線程執(zhí)行,所以cpython里的多線程其實(shí)是偽多線程。python使用協(xié)程代替多線程來(lái)解決,更輕量級(jí)的線程,進(jìn)程和線程的切換時(shí)系統(tǒng)確定的,而協(xié)程的切換是由程序員確定的,而模塊gevent下切換是遇到耗時(shí)操作才會(huì)切換的。進(jìn)程有線程,線程有協(xié)程。

什么是線程安全,什么是互斥鎖?

作用:保證同一時(shí)刻只有一個(gè)線程訪問(wèn)一個(gè)對(duì)象的功能。

由于同一進(jìn)程的多個(gè)線程之間是共享系統(tǒng)資源的,多個(gè)線程同時(shí)對(duì)一個(gè)對(duì)象進(jìn)行操作時(shí),一個(gè)線程對(duì)其進(jìn)行操作尚未結(jié)束cpu時(shí)間片切換到另一個(gè)線程對(duì)其操作,再切換回來(lái)時(shí),數(shù)據(jù)已被修改,導(dǎo)致結(jié)果出現(xiàn)錯(cuò)誤。此時(shí)需要對(duì)被操作的對(duì)象添加互斥鎖,保證每個(gè)線程對(duì)該對(duì)象的操作都能得到正確的結(jié)果。

說(shuō)說(shuō)下面幾個(gè)概念:同步,異步,阻塞,非阻塞?

同步:排隊(duì),一一執(zhí)行,一個(gè)執(zhí)行完,才執(zhí)行下一個(gè)。

異步:沒(méi)有先后順序,同時(shí)執(zhí)行。

阻塞:程序執(zhí)行到某段,不往下執(zhí)行了,卡在那里了。

非阻塞:如果這段卡主了,會(huì)執(zhí)行其他代碼。

什么是僵尸進(jìn)程和孤兒進(jìn)程?怎么避免僵尸進(jìn)程?

孤兒進(jìn)程:父進(jìn)程退出,子進(jìn)程還在運(yùn)行的這些子進(jìn)程都是孤兒進(jìn)程,孤兒進(jìn)程將被init 進(jìn)程(進(jìn)
程號(hào)為1)所收養(yǎng),并由init 進(jìn)程對(duì)它們完成狀態(tài)收集工作。
僵尸進(jìn)程:在UNIX 系統(tǒng)中,一個(gè)進(jìn)程結(jié)束了,但是他的父進(jìn)程沒(méi)有等待(調(diào)用wait / waitpid)他, 那么他將變成一個(gè)僵尸進(jìn)程

避免僵尸進(jìn)程的方法:
1.fork 兩次用孫子進(jìn)程去完成子進(jìn)程的任務(wù);
2.用wait()函數(shù)使父進(jìn)程阻塞;
3.使用信號(hào)量,在signal handler 中調(diào)用waitpid,這樣父進(jìn)程不用阻塞。

?

常見(jiàn)問(wèn)題總結(jié):

1. 線程和進(jìn)程有什么不同?
?? ?```python
?? ?進(jìn)程:1>系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單元
?? ??? ? ?2>進(jìn)程間不共享全局變量,需要進(jìn)行進(jìn)程間的通信
?? ??? ? ?3>進(jìn)程在運(yùn)行過(guò)程中為獨(dú)立的內(nèi)存單元
?? ?線程:1>進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位
?? ??? ? ?2>同時(shí)對(duì)一個(gè)全局變量進(jìn)行修改,容易混亂(不一定執(zhí)行完就換線程)
?? ??? ? ?3>線程依賴進(jìn)程的存在,線程并發(fā)性高,占用資源比進(jìn)程少
?? ??? ? ?4>多線程共享非全局變量不用加鎖
?? ??? ? ?5>多線程到同一個(gè)函數(shù)里執(zhí)行,函數(shù)里的變量各是各的
?? ?```
2. 什么是單任務(wù)、多任務(wù)程序?
? ? ```python
? ? 參考:
? ? 單任務(wù)是指一次只能運(yùn)行一個(gè)程序,不能同時(shí)運(yùn)行多個(gè)程序
? ? 多任務(wù)是指可以同時(shí)運(yùn)行多個(gè)程序
? ? ```
3. Linux系統(tǒng)是\_\_\_\_任務(wù)\_\_\_\_用戶的系統(tǒng)?
? ? ```python
? ? Linux系統(tǒng)是多任務(wù)多用戶的系統(tǒng)
? ? ```
4. 以單核cpu為例,它是怎樣完成多任務(wù)的?
? ? ```python
? ? 輪流切換執(zhí)行
? ? 微觀上,在任何一個(gè)時(shí)刻只有一個(gè)程序被執(zhí)行
? ? 但切換速度非常的快,因此在宏觀上,看上去多個(gè)任務(wù)在一起執(zhí)行一樣
? ? ```
5. 怎樣區(qū)分并行和并發(fā)?
? ? ```python
? ? 簡(jiǎn)單來(lái)講:
? ? 并行是指多個(gè)cpu同時(shí)執(zhí)行多個(gè)任務(wù)
? ? 并發(fā)是指單個(gè)cpu輪流切換執(zhí)行多個(gè)任務(wù)
? ? ```
6. 程序和進(jìn)程有什么區(qū)別?
? ? ```python
? ? 簡(jiǎn)而言之,代碼沒(méi)有被運(yùn)行之前是一個(gè)程序,當(dāng)運(yùn)行起來(lái)后就能成為進(jìn)程
? ? ```
8. 子進(jìn)程和父進(jìn)程是什么?
? ? ```python
? ? 通過(guò)進(jìn)程a產(chǎn)生的進(jìn)程b,a進(jìn)程就是父進(jìn)程,b就是子進(jìn)程
? ? ```
9. getpid、getppid的作用是什么?
? ? ```python
? ? getpid ? ?獲取當(dāng)前進(jìn)程的進(jìn)程號(hào)
? ? getppid ? ?獲取當(dāng)前進(jìn)程的父進(jìn)程的進(jìn)程號(hào)
? ? ```
10. 創(chuàng)建出來(lái)的多個(gè)子進(jìn)程,同時(shí)對(duì)一個(gè)相同名字的全局變量操作時(shí)會(huì)出錯(cuò)么?為什么?
? ? ```python
? ? 不會(huì)出錯(cuò)
? ? 因?yàn)檫M(jìn)程之間的資源是不共享的,各自擁有各自的一份該變量,操作互不影響
? ? ```

12. 創(chuàng)建出來(lái)的子進(jìn)程和父進(jìn)程到底是誰(shuí)先執(zhí)行?為什么?
? ? ```python
? ? 不確定
? ? 因?yàn)槎嗳蝿?wù)中,誰(shuí)先被執(zhí)行,是由cpu的調(diào)度算法來(lái)決定的,cpu會(huì)保證每個(gè)進(jìn)程都能被平均的執(zhí)行一段時(shí)間,一次你看上去會(huì)是隨機(jī)的
? ? ```

14. multiprocessing模塊的目的是什么?
?? ?```python
?? ?使用multiprocessing模塊中的Process創(chuàng)建一個(gè)子進(jìn)程
?? ?```
15. 怎樣用multiprocessing模塊中的Process創(chuàng)建一個(gè)子進(jìn)程?請(qǐng)寫(xiě)出基本代碼
? ?

?

from multiprocessing import Processdef mission():for i in range(5):print(i)if __name__ == "__main__":p = Process(target=mission) ? ?# 創(chuàng)建進(jìn)程實(shí)例p.start() ? ?# 啟動(dòng)子進(jìn)程p.join() ? ?# 讓父進(jìn)程等待

16. multiprocessing模塊中的Process創(chuàng)建了一個(gè)子進(jìn)程后,怎樣讓子進(jìn)程開(kāi)始執(zhí)行?
? ? ```python
? ? 調(diào)用start方法
? ? ```

18. 如果一個(gè)程序需要同時(shí)執(zhí)行多個(gè)任務(wù),那么一般會(huì)怎么做?
? ? ```python
? ? 使用多進(jìn)程或者多線程來(lái)實(shí)現(xiàn)
? ? ```

20. 什么是進(jìn)程池?有什么用?
? ? ```python
? ? 進(jìn)程池就是創(chuàng)建出一定固定數(shù)量的進(jìn)程,去執(zhí)行多個(gè)任務(wù)
? ? 節(jié)約創(chuàng)建進(jìn)程和銷毀進(jìn)程所消耗的資源和空間
? ? 當(dāng)某個(gè)任務(wù)被執(zhí)行完畢后,利用該進(jìn)程再去執(zhí)行其他的任務(wù),大大提高效率
? ? ```

19. 為了完成多個(gè)任務(wù)一起執(zhí)行,可以創(chuàng)建多個(gè)子進(jìn)程來(lái)執(zhí)行任務(wù),那么為什么還要進(jìn)程池呢?
? ? ```python
? ? 因?yàn)槊縿?chuàng)建一個(gè)進(jìn)程都會(huì)申請(qǐng)內(nèi)存空間,消耗資源,進(jìn)程結(jié)束又要回收資源
? ? 如果反復(fù)創(chuàng)建進(jìn)程,又結(jié)束進(jìn)程,會(huì)嚴(yán)重影響性能
? ? 進(jìn)程池的目的就是復(fù)用進(jìn)程,大大提高程序的運(yùn)行效率
? ? ```

21. 什么是進(jìn)程間通信?
? ? ```python
? ? 簡(jiǎn)而言之
? ? 進(jìn)程間的資源是不共享的,因此如果在不同進(jìn)程間的任務(wù)需要相互使用對(duì)方的資源或信息
? ? 那么就需要在進(jìn)程之間傳遞信息、傳遞資源,這就是進(jìn)程間通信
? ? ```

22. 為什么需要進(jìn)程間通信?
? ? ```python
? ? 同上
? ? ```

23. multiprocessing模塊中Queue怎樣發(fā)送、取出數(shù)據(jù)?
? ? ```python
? ? q = Queue()
? ? q.put(數(shù)據(jù)) ?# 存放數(shù)據(jù)
? ? q.get() ?# 取出數(shù)據(jù)
? ? ```

# 關(guān)卡二

練習(xí)題:1. 使用Process創(chuàng)建1個(gè)子進(jìn)程,讓子進(jìn)程每1秒鐘打印1個(gè)數(shù)字,數(shù)字從1開(kāi)始一直到10,即1.2.3......10
? ??

?

? ? # coding=utf-8import timefrom multiprocessing import Process# 定義子進(jìn)程的需要執(zhí)行的任務(wù) 函數(shù)def mission():#打印1-10for i in range(1,11):print(i)time.sleep(1)def main():p = Process(target=mission)p.start()p.join()if __name__ == "__main__":main()?


2. 使用multiprocessing模塊中的Queue,完成子進(jìn)程中將hello傳遞到父進(jìn)程中,父進(jìn)程打印出來(lái)

?

? # coding=utf-8import timefrom multiprocessing import Process, Queue# 定義父進(jìn)程的需要執(zhí)行的任務(wù) 函數(shù)def parent_mission(que):data = que.get() ? ?# 從隊(duì)列獲取數(shù)據(jù)打印print(data)time.sleep(5)# 定義子進(jìn)程的需要執(zhí)行的任務(wù) 函數(shù) ??def children_mission(que):data = "hello" ? # 輸入hello就會(huì)被父進(jìn)程拿到que.put(data) ? ?# ?往隊(duì)列添加數(shù)據(jù)time.sleep(3)def main():q = Queue() ? ?# 在父進(jìn)程中定義隊(duì)列,實(shí)現(xiàn)與子進(jìn)程通信p = Process(target=children_mission, args=(q,))p.start() ? ?# 啟動(dòng)子進(jìn)程 執(zhí)行任務(wù)parent_mission(q) ? ?# 在父進(jìn)程中 執(zhí)行任務(wù)p.join()if __name__ == "__main__":main() ? ?

1. 使用進(jìn)程池完成如下要求:
?? ?* 將/usr/lib/python3.5文件夾下的所有py結(jié)尾的文件copy到 桌面上的Test文件夾中
?? ?* 用多任務(wù)(多進(jìn)程或者多線程)的方式完成Test文件夾中的所有內(nèi)容復(fù)制
?? ?* 新的文件夾的名字為“Test-附件”
?? ?* 在復(fù)制文件的過(guò)程中,實(shí)時(shí)顯示復(fù)制的進(jìn)度

?

import multiprocessing import os import time import randomdef copy_file(queue, file_name,source_folder_name, dest_folder_name):"""copy文件到指定的路徑"""f_read = open(source_folder_name + "/" + file_name, "rb")f_write = open(dest_folder_name + "/" + file_name, "wb")while True:time.sleep(random.random())content = f_read.read(1024)if content:f_write.write(content)else:breakf_read.close()f_write.close()# 發(fā)送已經(jīng)拷貝完畢的文件名字queue.put(file_name)def main():# 獲取要復(fù)制的文件夾source_folder_name = input("請(qǐng)輸入要復(fù)制文件夾名字:")# 整理目標(biāo)文件夾dest_folder_name = source_folder_name + "[副本]"# 創(chuàng)建目標(biāo)文件夾try:os.mkdir(dest_folder_name)except:pass # 如果文件夾已經(jīng)存在,那么創(chuàng)建會(huì)失敗# 獲取這個(gè)文件夾中所有的普通文件名file_names = os.listdir(source_folder_name)# 創(chuàng)建Queuequeue = multiprocessing.Manager().Queue()# 創(chuàng)建進(jìn)程池pool = multiprocessing.Pool(3)for file_name in file_names:# 向進(jìn)程池中添加任務(wù)pool.apply_async(copy_file, args=(queue, file_name, source_folder_name, dest_folder_name))# 主進(jìn)程顯示進(jìn)度pool.close()all_file_num = len(file_names)while True:file_name = queue.get()if file_name in file_names:file_names.remove(file_name)copy_rate = (all_file_num-len(file_names))*100/all_file_numprint("\r%.2f...(%s)" % (copy_rate, file_name) + " "*50, end="")if copy_rate >= 100:breakprint()if __name__ == "__main__":main()

?

?

?

?

什么是多線程競(jìng)爭(zhēng)?

線程不是獨(dú)立的,同一個(gè)進(jìn)程里的線程,線程間的數(shù)據(jù)是共享的,多線程操作時(shí),容易造成數(shù)據(jù)的混亂,線程不安全。

如何解決?

互斥鎖。

好處:能夠保證某段關(guān)鍵代碼執(zhí)行時(shí),只有一個(gè)線程操作,保證原子性,避免多線程下的資源競(jìng)爭(zhēng)。

壞處:性能下降,阻止了多線程的并發(fā)執(zhí)行。致命問(wèn)題,有可能產(chǎn)生死鎖。

解釋一下什么是鎖,有哪幾種鎖?

鎖是python提供的對(duì)線程控制的對(duì)象。互斥鎖,可重入鎖,死鎖。

互斥鎖:同一時(shí)刻只允許一個(gè)線程操作,具有排他性和唯一性。比如A、B兩個(gè)線程,A操作時(shí),B只能等著,A執(zhí)行完,B才能操作。

可重入鎖:有時(shí)候在同一個(gè)線程中,我們可能會(huì)多次請(qǐng)求同一資源(就是,獲取同一鎖鑰匙),俗稱鎖嵌套。

死鎖:互相干等著,都不釋放鎖,程序無(wú)法執(zhí)行下去。

GIL鎖(全局解釋器鎖):限制多線程的同時(shí)執(zhí)行,同一時(shí)間,只有一個(gè)線程執(zhí)行,所以cpython里的多線程其實(shí)是偽多線程。python使用協(xié)程代替多線程來(lái)解決,更輕量級(jí)的線程,進(jìn)程和線程的切換時(shí)系統(tǒng)確定的,而協(xié)程的切換是由程序員確定的,而模塊gevent下切換是遇到耗時(shí)操作才會(huì)切換的。進(jìn)程有線程,線程有協(xié)程。

什么是線程安全,什么是互斥鎖?

作用:保證同一時(shí)刻只有一個(gè)線程訪問(wèn)一個(gè)對(duì)象的功能。

由于同一進(jìn)程的多個(gè)線程之間是共享系統(tǒng)資源的,多個(gè)線程同時(shí)對(duì)一個(gè)對(duì)象進(jìn)行操作時(shí),一個(gè)線程對(duì)其進(jìn)行操作尚未結(jié)束cpu時(shí)間片切換到另一個(gè)線程對(duì)其操作,再切換回來(lái)時(shí),數(shù)據(jù)已被修改,導(dǎo)致結(jié)果出現(xiàn)錯(cuò)誤。此時(shí)需要對(duì)被操作的對(duì)象添加互斥鎖,保證每個(gè)線程對(duì)該對(duì)象的操作都能得到正確的結(jié)果。

說(shuō)說(shuō)下面幾個(gè)概念:同步,異步,阻塞,非阻塞?

同步:排隊(duì),一一執(zhí)行,一個(gè)執(zhí)行完,才執(zhí)行下一個(gè)。

異步:沒(méi)有先后順序,同時(shí)執(zhí)行。

阻塞:程序執(zhí)行到某段,不往下執(zhí)行了,卡在那里了。

非阻塞:如果這段卡主了,會(huì)執(zhí)行其他代碼。

什么是僵尸進(jìn)程和孤兒進(jìn)程?怎么避免僵尸進(jìn)程?

孤兒進(jìn)程:父進(jìn)程退出,子進(jìn)程還在運(yùn)行的這些子進(jìn)程都是孤兒進(jìn)程,孤兒進(jìn)程將被init 進(jìn)程(進(jìn)
程號(hào)為1)所收養(yǎng),并由init 進(jìn)程對(duì)它們完成狀態(tài)收集工作。
僵尸進(jìn)程:在UNIX 系統(tǒng)中,一個(gè)進(jìn)程結(jié)束了,但是他的父進(jìn)程沒(méi)有等待(調(diào)用wait / waitpid)他, 那么他將變成一個(gè)僵尸進(jìn)程

避免僵尸進(jìn)程的方法:
1.fork 兩次用孫子進(jìn)程去完成子進(jìn)程的任務(wù);
2.用wait()函數(shù)使父進(jìn)程阻塞;
3.使用信號(hào)量,在signal handler 中調(diào)用waitpid,這樣父進(jìn)程不用阻塞。

?

常見(jiàn)問(wèn)題總結(jié):

1. 線程和進(jìn)程有什么不同?
?? ?```python
?? ?進(jìn)程:1>系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單元
?? ??? ? ?2>進(jìn)程間不共享全局變量,需要進(jìn)行進(jìn)程間的通信
?? ??? ? ?3>進(jìn)程在運(yùn)行過(guò)程中為獨(dú)立的內(nèi)存單元
?? ?線程:1>進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位
?? ??? ? ?2>同時(shí)對(duì)一個(gè)全局變量進(jìn)行修改,容易混亂(不一定執(zhí)行完就換線程)
?? ??? ? ?3>線程依賴進(jìn)程的存在,線程并發(fā)性高,占用資源比進(jìn)程少
?? ??? ? ?4>多線程共享非全局變量不用加鎖
?? ??? ? ?5>多線程到同一個(gè)函數(shù)里執(zhí)行,函數(shù)里的變量各是各的
?? ?```
2. 什么是單任務(wù)、多任務(wù)程序?
? ? ```python
? ? 參考:
? ? 單任務(wù)是指一次只能運(yùn)行一個(gè)程序,不能同時(shí)運(yùn)行多個(gè)程序
? ? 多任務(wù)是指可以同時(shí)運(yùn)行多個(gè)程序
? ? ```
3. Linux系統(tǒng)是\_\_\_\_任務(wù)\_\_\_\_用戶的系統(tǒng)?
? ? ```python
? ? Linux系統(tǒng)是多任務(wù)多用戶的系統(tǒng)
? ? ```
4. 以單核cpu為例,它是怎樣完成多任務(wù)的?
? ? ```python
? ? 輪流切換執(zhí)行
? ? 微觀上,在任何一個(gè)時(shí)刻只有一個(gè)程序被執(zhí)行
? ? 但切換速度非常的快,因此在宏觀上,看上去多個(gè)任務(wù)在一起執(zhí)行一樣
? ? ```
5. 怎樣區(qū)分并行和并發(fā)?
? ? ```python
? ? 簡(jiǎn)單來(lái)講:
? ? 并行是指多個(gè)cpu同時(shí)執(zhí)行多個(gè)任務(wù)
? ? 并發(fā)是指單個(gè)cpu輪流切換執(zhí)行多個(gè)任務(wù)
? ? ```
6. 程序和進(jìn)程有什么區(qū)別?
? ? ```python
? ? 簡(jiǎn)而言之,代碼沒(méi)有被運(yùn)行之前是一個(gè)程序,當(dāng)運(yùn)行起來(lái)后就能成為進(jìn)程
? ? ```
8. 子進(jìn)程和父進(jìn)程是什么?
? ? ```python
? ? 通過(guò)進(jìn)程a產(chǎn)生的進(jìn)程b,a進(jìn)程就是父進(jìn)程,b就是子進(jìn)程
? ? ```
9. getpid、getppid的作用是什么?
? ? ```python
? ? getpid ? ?獲取當(dāng)前進(jìn)程的進(jìn)程號(hào)
? ? getppid ? ?獲取當(dāng)前進(jìn)程的父進(jìn)程的進(jìn)程號(hào)
? ? ```
10. 創(chuàng)建出來(lái)的多個(gè)子進(jìn)程,同時(shí)對(duì)一個(gè)相同名字的全局變量操作時(shí)會(huì)出錯(cuò)么?為什么?
? ? ```python
? ? 不會(huì)出錯(cuò)
? ? 因?yàn)檫M(jìn)程之間的資源是不共享的,各自擁有各自的一份該變量,操作互不影響
? ? ```

12. 創(chuàng)建出來(lái)的子進(jìn)程和父進(jìn)程到底是誰(shuí)先執(zhí)行?為什么?
? ? ```python
? ? 不確定
? ? 因?yàn)槎嗳蝿?wù)中,誰(shuí)先被執(zhí)行,是由cpu的調(diào)度算法來(lái)決定的,cpu會(huì)保證每個(gè)進(jìn)程都能被平均的執(zhí)行一段時(shí)間,一次你看上去會(huì)是隨機(jī)的
? ? ```

14. multiprocessing模塊的目的是什么?
?? ?```python
?? ?使用multiprocessing模塊中的Process創(chuàng)建一個(gè)子進(jìn)程
?? ?```
15. 怎樣用multiprocessing模塊中的Process創(chuàng)建一個(gè)子進(jìn)程?請(qǐng)寫(xiě)出基本代碼
? ?

  • from multiprocessing import Process
  • def mission():
  • for i in range(5):
  • print(i)
  • if __name__ == "__main__":
  • p = Process(target=mission) ? ?# 創(chuàng)建進(jìn)程實(shí)例
  • p.start() ? ?# 啟動(dòng)子進(jìn)程
  • p.join() ? ?# 讓父進(jìn)程等待
  • 16. multiprocessing模塊中的Process創(chuàng)建了一個(gè)子進(jìn)程后,怎樣讓子進(jìn)程開(kāi)始執(zhí)行?
    ? ? ```python
    ? ? 調(diào)用start方法
    ? ? ```

    18. 如果一個(gè)程序需要同時(shí)執(zhí)行多個(gè)任務(wù),那么一般會(huì)怎么做?
    ? ? ```python
    ? ? 使用多進(jìn)程或者多線程來(lái)實(shí)現(xiàn)
    ? ? ```

    20. 什么是進(jìn)程池?有什么用?
    ? ? ```python
    ? ? 進(jìn)程池就是創(chuàng)建出一定固定數(shù)量的進(jìn)程,去執(zhí)行多個(gè)任務(wù)
    ? ? 節(jié)約創(chuàng)建進(jìn)程和銷毀進(jìn)程所消耗的資源和空間
    ? ? 當(dāng)某個(gè)任務(wù)被執(zhí)行完畢后,利用該進(jìn)程再去執(zhí)行其他的任務(wù),大大提高效率
    ? ? ```

    19. 為了完成多個(gè)任務(wù)一起執(zhí)行,可以創(chuàng)建多個(gè)子進(jìn)程來(lái)執(zhí)行任務(wù),那么為什么還要進(jìn)程池呢?
    ? ? ```python
    ? ? 因?yàn)槊縿?chuàng)建一個(gè)進(jìn)程都會(huì)申請(qǐng)內(nèi)存空間,消耗資源,進(jìn)程結(jié)束又要回收資源
    ? ? 如果反復(fù)創(chuàng)建進(jìn)程,又結(jié)束進(jìn)程,會(huì)嚴(yán)重影響性能
    ? ? 進(jìn)程池的目的就是復(fù)用進(jìn)程,大大提高程序的運(yùn)行效率
    ? ? ```

    21. 什么是進(jìn)程間通信?
    ? ? ```python
    ? ? 簡(jiǎn)而言之
    ? ? 進(jìn)程間的資源是不共享的,因此如果在不同進(jìn)程間的任務(wù)需要相互使用對(duì)方的資源或信息
    ? ? 那么就需要在進(jìn)程之間傳遞信息、傳遞資源,這就是進(jìn)程間通信
    ? ? ```

    22. 為什么需要進(jìn)程間通信?
    ? ? ```python
    ? ? 同上
    ? ? ```

    23. multiprocessing模塊中Queue怎樣發(fā)送、取出數(shù)據(jù)?
    ? ? ```python
    ? ? q = Queue()
    ? ? q.put(數(shù)據(jù)) ?# 存放數(shù)據(jù)
    ? ? q.get() ?# 取出數(shù)據(jù)
    ? ? ```

    # 關(guān)卡二

    練習(xí)題:1. 使用Process創(chuàng)建1個(gè)子進(jìn)程,讓子進(jìn)程每1秒鐘打印1個(gè)數(shù)字,數(shù)字從1開(kāi)始一直到10,即1.2.3......10
    ? ??

  • # coding=utf-8
  • import time
  • from multiprocessing import Process
  • # 定義子進(jìn)程的需要執(zhí)行的任務(wù) 函數(shù)
  • def mission():
  • #打印1-10
  • for i in range(1,11):
  • print(i)
  • time.sleep(1)
  • def main():
  • p = Process(target=mission)
  • p.start()
  • p.join()
  • if __name__ == "__main__":
  • main()?

  • 2. 使用multiprocessing模塊中的Queue,完成子進(jìn)程中將hello傳遞到父進(jìn)程中,父進(jìn)程打印出來(lái)
    ?

  • # coding=utf-8
  • import time
  • from multiprocessing import Process, Queue
  • # 定義父進(jìn)程的需要執(zhí)行的任務(wù) 函數(shù)
  • def parent_mission(que):
  • data = que.get() ? ?# 從隊(duì)列獲取數(shù)據(jù)打印
  • print(data)
  • time.sleep(5)
  • # 定義子進(jìn)程的需要執(zhí)行的任務(wù) 函數(shù) ??
  • def children_mission(que):
  • data = "hello" ? # 輸入hello就會(huì)被父進(jìn)程拿到
  • que.put(data) ? ?# ?往隊(duì)列添加數(shù)據(jù)
  • time.sleep(3)
  • def main():
  • q = Queue() ? ?# 在父進(jìn)程中定義隊(duì)列,實(shí)現(xiàn)與子進(jìn)程通信
  • p = Process(target=children_mission, args=(q,))
  • p.start() ? ?# 啟動(dòng)子進(jìn)程 執(zhí)行任務(wù)
  • parent_mission(q) ? ?# 在父進(jìn)程中 執(zhí)行任務(wù)
  • p.join()
  • if __name__ == "__main__":
  • main() ? ?
  • 1. 使用進(jìn)程池完成如下要求:
    ?? ?* 將/usr/lib/python3.5文件夾下的所有py結(jié)尾的文件copy到 桌面上的Test文件夾中
    ?? ?* 用多任務(wù)(多進(jìn)程或者多線程)的方式完成Test文件夾中的所有內(nèi)容復(fù)制
    ?? ?* 新的文件夾的名字為“Test-附件”
    ?? ?* 在復(fù)制文件的過(guò)程中,實(shí)時(shí)顯示復(fù)制的進(jìn)度

      

    import multiprocessing import os import time import randomdef copy_file(queue, file_name,source_folder_name, dest_folder_name):"""copy文件到指定的路徑"""f_read = open(source_folder_name + "/" + file_name, "rb")f_write = open(dest_folder_name + "/" + file_name, "wb")while True:time.sleep(random.random())content = f_read.read(1024)if content:f_write.write(content)else:breakf_read.close()f_write.close()# 發(fā)送已經(jīng)拷貝完畢的文件名字 queue.put(file_name)def main():# 獲取要復(fù)制的文件夾source_folder_name = input("請(qǐng)輸入要復(fù)制文件夾名字:")# 整理目標(biāo)文件夾dest_folder_name = source_folder_name + "[副本]"# 創(chuàng)建目標(biāo)文件夾try:os.mkdir(dest_folder_name)except:pass # 如果文件夾已經(jīng)存在,那么創(chuàng)建會(huì)失敗# 獲取這個(gè)文件夾中所有的普通文件名file_names = os.listdir(source_folder_name)# 創(chuàng)建Queuequeue = multiprocessing.Manager().Queue()# 創(chuàng)建進(jìn)程池pool = multiprocessing.Pool(3)for file_name in file_names:# 向進(jìn)程池中添加任務(wù)pool.apply_async(copy_file, args=(queue, file_name, source_folder_name, dest_folder_name))# 主進(jìn)程顯示進(jìn)度 pool.close()all_file_num = len(file_names)while True:file_name = queue.get()if file_name in file_names:file_names.remove(file_name)copy_rate = (all_file_num-len(file_names))*100/all_file_numprint("\r%.2f...(%s)" % (copy_rate, file_name) + " "*50, end="")if copy_rate >= 100:breakprint()if __name__ == "__main__":main()

    ?

    ?

    ?

  • 1 import multiprocessing 2 import os 3 import time 4 import random 5 6 7 def copy_file(queue, file_name,source_folder_name, dest_folder_name): 8 """copy文件到指定的路徑""" 9 f_read = open(source_folder_name + "/" + file_name, "rb") 10 f_write = open(dest_folder_name + "/" + file_name, "wb") 11 while True: 12 time.sleep(random.random()) 13 content = f_read.read(1024) 14 if content: 15 f_write.write(content) 16 else: 17 break 18 f_read.close() 19 f_write.close() 20 21 # 發(fā)送已經(jīng)拷貝完畢的文件名字 22 queue.put(file_name) 23 24 25 def main(): 26 # 獲取要復(fù)制的文件夾 27 source_folder_name = input("請(qǐng)輸入要復(fù)制文件夾名字:") 28 29 # 整理目標(biāo)文件夾 30 dest_folder_name = source_folder_name + "[副本]" 31 32 # 創(chuàng)建目標(biāo)文件夾 33 try: 34 os.mkdir(dest_folder_name) 35 except: 36 pass # 如果文件夾已經(jīng)存在,那么創(chuàng)建會(huì)失敗 37 38 # 獲取這個(gè)文件夾中所有的普通文件名 39 file_names = os.listdir(source_folder_name) 40 41 # 創(chuàng)建Queue 42 queue = multiprocessing.Manager().Queue() 43 44 # 創(chuàng)建進(jìn)程池 45 pool = multiprocessing.Pool(3) 46 47 for file_name in file_names: 48 # 向進(jìn)程池中添加任務(wù) 49 pool.apply_async(copy_file, args=(queue, file_name, source_folder_name, dest_folder_name)) 50 51 # 主進(jìn)程顯示進(jìn)度 52 pool.close() 53 54 all_file_num = len(file_names) 55 while True: 56 file_name = queue.get() 57 if file_name in file_names: 58 file_names.remove(file_name) 59 60 copy_rate = (all_file_num-len(file_names))*100/all_file_num 61 print("\r%.2f...(%s)" % (copy_rate, file_name) + " "*50, end="") 62 if copy_rate >= 100: 63 break 64 print() 65 66 67 if __name__ == "__main__": 68 main()

    ?

    ?uma?
  • 轉(zhuǎn)載于:https://www.cnblogs.com/kaiping23/p/9622071.html

    《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的python进程、线程的学习心得的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。