python父進程調用子進程(python父進程調用子進程通信)

  • 1、python父進程如何捕捉每個子進程的狀態
  • 2、如何使用Python,在Windows下保證父進程退出時,子進程同樣退出
  • 3、python遍歷目錄就是這麼簡單
  • 4、python 多進程

基於文本文檔(Markdown) 設想好需要的基本需要的表、字段、類型;

使用 Rails Migration 隨着功能的開發逐步創建表;

隨着細節功能的開發、需求,逐步增加字段,刪除字段,或者調整字段類型;

第一個 Release 的時候清理 Migrations 合併成一個;

隨着後期的改動,逐步增加、修改、刪除字段或表。

基本上我的所有項目都是這麼搞的,這和項目是否複雜無關。

所以我前面為什麼說思路需要轉變。

如果你用的threading的話,可調用父進程的setDaemon方法並傳入True參數。

有時我們有列出目錄下都有哪些文件和子目錄的需求,這種情況是有現成命令可用的,比如windows下的dir命令,linux下的ls命令都可以,那我們用python代碼怎麼實現呢?

我們利用python豐富的庫很容易就能實現一個簡易版本,下面我們就用4種方法來實現它。

一、使用os.popen

os.popen工作原理是新建一個子進程,然後用這個子進程執行命令,父進程與子進程間通過管道進行通信。

根據調用popen時的傳參,我們可以通過管道讀取子進程的輸出也可以向子進程寫數據,默認是讀取子進程的輸出。

從以上描述可以看出popen是非常通用的,不是只能用於我們這個例子哦。

那我們開始用它實現我們的需求吧,代碼如下:

哈哈,是不是很簡單,這種方式雖然能達到目的但其實並不是我們想要的,我們本來就是要實現ls的,結果調用了ls,所以嚴格意義上來說我們並沒有實現ls,那讓我們繼續往下看其它方法吧,嘿嘿。

二、使用glob.glob

glob可以根據你使用的通配符對文件進行匹配,利用這個特性我們可以列出當前目錄下都有哪些文件和子目錄,如下代碼:

三、使用os.listdir

os.listdir同樣可以列出某個目錄下都有哪些文件和子目錄,如下代碼:

四、使用os.walk

os.walk在遍歷目錄方面非常強大,它不但可以遍歷你需要的目錄,也可以遞歸遍歷子目錄且遞歸的深度可以用代碼控制,下面讓我們分別看下怎麼遍歷整個目錄樹以及怎麼控制深度吧。

os.walk默認是遍歷整個目錄樹的,如下代碼就會遞歸打印出當前目錄下所有文件:

那我們怎麼控制遍歷的深度,比如只遍歷n層呢?其實很簡單,只需要定義一個深度變量,然後到達n後跳出循環即可,如下代碼就只遍歷1層:

至此我們已經寫完4種方法了,如果你還有其他方法,歡迎評論交流。

基於官方文檔:

日樂購,剛才看到的一個博客,寫的都不太對,還是基於官方的比較穩妥

我就是喜歡抄官方的,哈哈

通常我們使用Process實例化一個進程,並調用 他的 start() 方法啟動它。

這種方法和 Thread 是一樣的。

上圖中,我寫了 p.join() 所以主進程是 等待 子進程執行完後,才執行 print(“運行結束”)

否則就是反過來了(這個不一定,看你的語句了,順序其實是隨機的)例如:

主進加個 sleep

所以不加join() ,其實子進程和主進程是各干各的,誰也不等誰。都執行完後,文件運行就結束了

上面我們用了 os.getpid() 和 os.getppid() 獲取 當前進程,和父進程的id

下面就講一下,這兩個函數的用法:

os.getpid()

返回當前進程的id

os.getppid()

返回父進程的id。 父進程退出後,unix 返回初始化進程(1)中的一個

windows返回相同的id (可能被其他進程使用了)

這也就解釋了,為啥我上面 的程序運行多次, 第一次打印的parentid 都是 14212 了。

而子進程的父級 process id 是調用他的那個進程的 id : 1940

視頻筆記:

多進程:使用大致方法:

參考: 進程通信(pipe和queue)

pool.map (函數可以有return 也可以共享內存或queue) 結果直接是個列表

poll.apply_async() (同map,只不過是一個進程,返回結果用 xx.get() 獲得)

報錯:

參考 :

把 pool = Pool() 放到 if name == ” main “: 下面初始化搞定。

結果:

這個肯定有解釋的

測試多進程計算效果:

進程池運行:

結果:

普通計算:

我們同樣傳入 1 2 10 三個參數測試:

其實對比下來開始快了一半的;

我們把循環里的數字去掉一個 0;

單進程:

多進程:

兩次測試 單進程/進程池 分別為 0.669 和 0.772 幾乎成正比的。

問題 二:

視圖:

post 視圖裏面

Music 類:

直接報錯:

寫在 類裏面也 在函數里用 self.pool 調用也不行,也是相同的錯誤。

最後 把 pool = Pool 直接寫在 search 函數裏面,奇蹟出現了:

前台也能顯示搜索的音樂結果了

總結一點,進程這個東西,最好 寫在 直接運行的函數裏面,而不是 一個函數跳來跳去。因為最後可能 是在子進程的子進程運行的,這是不許的,會報錯。

還有一點,多進程運行的函數對象,不能是 lambda 函數。也許lambda 虛擬,在內存??

使用 pool.map 子進程 函數報錯,導致整個 pool 掛了:

參考:

主要你要,對函數內部捕獲錯誤,而不能讓異常拋出就可以了。

關於map 傳多個函數參數

我一開始,就是正常思維,多個參數,搞個元祖,讓參數一一對應不就行了:

報錯:

參考:

普通的 process 當讓可以穿多個參數,map 卻不知道咋傳的。

apply_async 和map 一樣,不知道咋傳的。

最簡單的方法:

使用 starmap 而不是 map

結果:

子進程結束

1.8399453163146973

成功拿到結果了

關於map 和 starmap 不同的地方看源碼:

關於apply_async() ,我沒找到多參數的方法,大不了用 一個迭代的 starmap 實現。哈哈

關於 上面源碼裏面有 itertools.starmap

itertools 用法參考:

有個問題,多進程最好不要使用全部的 cpu , 因為這樣可能影響其他任務,所以 在進程池 添加 process 參數 指定,cpu 個數:

上面就是預留了 一個cpu 干其他事的

後面直接使用 Queue 遇到這個問題:

解決:

Manager().Queue() 代替 Queue()

因為 queue.get() 是堵塞型的,所以可以提前判斷是不是 空的,以免堵塞進程。比如下面這樣:

使用 queue.empty() 空為True

原創文章,作者:ABDBS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/126935.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ABDBS的頭像ABDBS
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論