python--進程初識詳解

来源:https://www.cnblogs.com/june-L/archive/2019/11/04/11795765.html
-Advertisement-
Play Games

進程:通俗理解一個運行的程式或者軟體,進程是操作系統資源分配的基本單位 1.1、導入進程模塊 import multiprocessing 1.2、Process進程類的語法結構如下: Process([group[, target[, name[,args[,kwargs]]]]]) group: ...



進程:通俗理解一個運行的程式或者軟體,進程是操作系統資源分配的基本單位

1.1、導入進程模塊
import multiprocessing

1.2、Process進程類的語法結構如下:

Process([group[, target[, name[,args[,kwargs]]]]])

group: --指定進程組,目前只能使用None
target: --執行的目標任務名
name: --進程名字
args: --以元組方式給執行任務傳參
kwargs: --以字典方式給執行任務傳參

Process創建 的實例對象的常用方法:

start(), 啟動子進程實例(創建子進程)
join(timeout), 是否等待子進程執行結束,或等待多少秒
terminate(), 不管任務是否完成,立即終止進程

Process創建的實例對象的常用屬性:

name 當前進程的別名,預設為Process-N,N為從1開始遞增的整數。
pid 當前進程的pid(進程號)

 

一、多進程完成多任務代碼

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """
 4 python進程
 5 """
 6 import multiprocessing
 7 import time
 8 
 9 def run_proc():
10     """
11     子進程要執行的代碼
12     :return:
13     """
14     while True:
15         print("---2---")
16         time.sleep(1)
17 
18 if __name__ == "__main__":
19     #創建子進程
20     sub_process = multiprocessing.Process(target=run_proc)
21     #啟動子進程
22     sub_process.start()
23     while True:
24         print("----1----")
25         time.sleep(1)

代碼執行結果:

 

二、獲取進程pid

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """
 4 獲取進程pid
 5 """
 6 
 7 import multiprocessing
 8 import time
 9 import os
10 
11 def work():
12     #查看當前進程
13     current_process = multiprocessing.current_process()
14     print("work:", current_process)
15     #獲取當前進程的編號
16     print("work進程編號:", current_process.pid, os.getpid())
17     #獲取父進程的編號
18     print("work父進程的編號:", os.getppid())
19     for i in range(10):
20         print("工作中....")
21         time.sleep(0.2)
22         #擴展,根據進程編號殺死對應的進程
23         os.kill(os.getpid(), 9)
24 
25 if __name__ == "__main__":
26     #查看當前進程
27     current_process = multiprocessing.current_process()
28     print("main:", current_process)
29     #獲取當前里程的編號
30     print("main進程的編號:", current_process.pid)
31 
32     #創建子進程
33     sub_process = multiprocessing.Process(target=work)
34     #啟動進程
35     sub_process.start()
36 
37     #主進程執行列印信息操作
38     for i in range(5):
39         print("我在主進程中執行....")
40         time.sleep(0.2)

代碼執行結果:

 

三、進程的基本狀態及狀態之間的關係

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """
 4 給子進程指定的函數傳遞參數
 5 """
 6 
 7 import multiprocessing
 8 
 9 #定義一個用於顯示信息的方法
10 def show_info(name, age):
11     print("name:", name, "; age:", age)
12 
13 if __name__ == "__main__":
14     sub_process = multiprocessing.Process(target=show_info, args=("yusheng_liang", 20))
15     #啟動進程
16     sub_process.start()

代碼執行結果:

 

四、進程之間不共用全局變數

註意:創建子進程其實是對主進程進行拷貝,進程之間相互獨立,訪問的全局變數不是同一個,所以進程之間不共用全局變數

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
進程之間不共用全局變數
"""
import multiprocessing
import time

#定義全局變數
my_list = list()

#定義寫入數據的方法
def write_data():
    for i in range(5):
        my_list.append(i)
        time.sleep(0.2)
    print("write_data: ", my_list)

#定義讀取數據的方法
def read_data():
    print("read_data: ", my_list)

if __name__ == "__main__":
    #創建寫入數據的進程
    write_process = multiprocessing.Process(target=write_data)
    #創建讀取數據的進程
    read_process = multiprocessing.Process(target=read_data)

    write_process.start()

    #主進程等待寫入進程執行完成以後代碼,再繼續往下執行
    write_process.join()
    read_process.start()

代碼執行結果:

 

 

五、主進程會等待所有的子進程執行完成程式再退出

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """
 4 主進程會等待所有的子進程執行完成程式再退出
 5 """
 6 import multiprocessing
 7 import time
 8 
 9 #測試子進程是否執行完成以後主進程才能退出
10 def work():
11     for i in range(7):
12         print("工作中.....")
13         time.sleep(0.2)
14 
15 if __name__ == "__main__":
16     #創建子進程
17     work_process = multiprocessing.Process(target=work)
18     work_process.start()
19 
20     #讓主進程等待1秒鐘
21     time.sleep(1)
22     print("主進程執行完成了啦!!")
23 

代碼執行結果:

 

六、銷毀子進程的代碼

 

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 """
 4 主進程會等待所有的子進程執行完成程式再退出
 5 """
 6 import multiprocessing
 7 import time
 8 
 9 #測試子進程是否執行完成以後主進程才能退出
10 def work():
11     for i in range(7):
12         print("工作中.....")
13         time.sleep(0.2)
14 
15 if __name__ == "__main__":
16     #創建子進程
17     work_process = multiprocessing.Process(target=work)
18     work_process.start()
19 
20     #讓主進程等待1秒鐘
21     time.sleep(1)
22     print("主進程執行完成了啦!!")
23 
24     #讓子進程直接銷毀,表示終止執行,主進程退出之前,把所有的子進程直接銷毀就可以了
25     work_process.terminate()

 

代碼執行的結果:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們只需要一段載入代碼就可以搞定MarkDown載入模板文件。 相關推薦: 1.在Asp.Net或.Net Core中配置使用MarkDown富文本編輯器有開源模板代碼(代碼是.net core3.0版本) 2.在Asp.Net Core中配置使用MarkDown富文本編輯器實現圖片上傳和截圖上傳( ...
  • a.小程式不支持<embed>標簽。 1. createPreviewVideo 所在位置video.js 代碼: $("#eduiVideoPreview", me.$widget)[0].innerHTML = '<video pluginspage="http://www.macromedia ...
  • Array.prototype.concat.call(array1, array2, array3, ...) ...
  • <template> <div :class="className"> <div :id="id" class="spiritChartBox"></div> </div> </template> <script> import { mapState } from "vuex"; import ec... ...
  • JS使用方法 模態窗提供了四個事件: 1.show.bs.modal在顯示之前觸發 2.shown.bs.modal在顯示之後觸發 3.hide.bs.modal在隱藏之前觸發 4.hidden.bs.modal在隱藏之後觸發 ...
  • jQuery的DOM遍歷模塊對DOM模型的原生屬性parentNode、childNodes、firstChild、lastChild、previousSibling、nextSibling進行了封裝和擴展,用於在DOM樹中遍歷父元素、子元素和兄弟元素。 可以通過jQuery的實例來訪問,方法如下: ...
  • "洛谷題目頁面傳送門" & "CodeForces題目頁面傳送門" 定義一個$1\sim n$的排列$a$的平方$a^2=b$,當且僅當$\forall i\in[1,n],b_i=a_{a_i}$,即$a^2$為將$a$在$[1,2,\cdots,n]$上映射$2$次所得的排列。現在給定一個$1\ ...
  • 2019-11-04-23:03:13 目錄: 1.常用的數據結構 2.棧 3.隊列 4.數組 5.鏈表 6.紅黑樹 常用的數據結構: 包含:棧、隊列、數組、鏈表和紅黑樹 棧: 棧:stack,又稱堆棧,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其 他任何位置進行添加 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...