Python 併發編程-進程

来源:https://www.cnblogs.com/hades0607/archive/2018/09/02/9575798.html
-Advertisement-
Play Games

Process類參數介紹 group 參數未使用, 值始終為None target 表示調用對象, 即子進程要執行的任務 args 表示調用對象的位置參數元組, args=(1,2,'hades',) 是一個元組形式,必須有逗號 kwargs 表示調用對象的字典, kwargs={'name':'h ...


Process類參數介紹

group  --------  參數未使用, 值始終為None

target  --------  表示調用對象, 即子進程要執行的任務

args  ----------  表示調用對象的位置參數元組, args=(1,2,'hades',) 是一個元組形式,必須有逗號

kwargs  -------  表示調用對象的字典, kwargs={'name':'hades','age':18}

name  ---------  為子進程的名稱

 

Process類方法介紹

p.start()  -----------------  啟動進程, 並調用該子進程中的p.run()

p.run()  -------------------  進程啟動時運行的方法, 正是它去調用target指定的函數, 自定義類的類中一定要實現該方法

p.terminate()  -----------  強制終止進程p, 不會進行任何清理操作, 如果p創建了子進程, 該子進程就成了僵屍進程, 使用該方法需要特別小心這種情況.

             如果p還保存了一個鎖那麼也將不會被釋放, 進而導致死鎖

p.is_alive()  --------------  判斷進程是否存活, 如果p仍然運行, 返回True

p.join()  -------------------  主進程等待p子進程終止(是主進程處於等的狀態,而p子進程處於運行的狀態), 只能join住start開啟的進程, 不能join住run開啟的進程

 

Process類屬性介紹

p.daemon  ---------------  預設值為False,如果設為True, 代表p為後臺運行的守護進程, 當p的父進程終止時, p也隨之終止, 並且設定為True後, p不能創建自己的新進程,必須在p.start()之前設置

p.name  ------------------  進程的名稱

p.pid  ---------------------  進程的pid

p.exitcode  --------------  進程在運行時為None, 如果為-N, 表示被信號N結束了(瞭解知識點)

p.authkey  ---------------  進程的身份驗證鍵,預設是由os.urandom()隨機生成的32字元的字元串.

            這個鍵的用途是為涉及網路連接的底層進程間通信提供安全性,這類連接只有在具有相同的身份驗證鍵時才能成功(瞭解知識點)          

 

 

什麼是進程

使用進程是要實現併發效果

 

進程就是一個正在進行/運行的程式, 換言之, 進程指的是一個程式的運行過程

程式vs進程:

  程式: 只是一堆代碼文件

  進程: 程式運行的過程才是進程

 

串列: 一個任務完完整整地運行完畢, 再執行下一個任務, 按次序依次進行

判斷串列的概念:

  串列看起來就是一個一個運行的: 對

  一個一個的運行就是串列: 錯誤

 

併發(切換+保存狀態):  多個任務看起來是同時運行, 單核就可以實行併發

並行:  多個任務是真正意義上的同時運行, 只有多核才能實現並行

 

多道技術的產生背景:  就是想要在單核下實現併發

如何實現:

  1. 空間上的復用: 將記憶體分為幾部分, 每個部分放入一個程式的數據, 這樣同一時間記憶體中就有了多道程式的數據, 為CPU在多個任務間切換做準備

  2. 時間上的復用: 多個進程共用CPU的時間

    關鍵點就是CPU在多個任務之間進行切換

    有兩種情況下會發生切換:

      1. 一個任務占用CPU時間過長(沒有遇到IO操作): 會降低效率

      2. 一個任務在運行的過程中遇到IO操作: 可以提升效率

 

開啟子進程的方式1

 1 from multiprocessing import Process
 2 import time
 3 
 4 
 5 def task(name):
 6     print('%s is running' % name)
 7     time.sleep(3)
 8     print('%s is done' % name)
 9 
10 
11 # 在windows系統上開啟子進程的操作必須放到該行代碼下
12 if __name__ == '__main__':
13     p = Process(target=task, args=('子進程',))  # Process(target=task,kwargs={'name':'子進程'}) #
14     p.start()  # 僅僅只是向操作系統發送一個創造子進程的信號
15     print('')

 終端列印:

 

 

開啟子進程的方式2

 1 from multiprocessing import Process
 2 import time
 3 
 4 
 5 class Myprocess(Process):
 6     def __init__(self, name):
 7         super().__init__()
 8         self.name = name
 9 
10     def run(self):
11         print('%s is running' % self.name)
12         time.sleep(3)
13         print('%s is done' % self.name)
14 
15 
16 # 在windows系統上開啟子進程的操作必須放到該行代碼下
17 if __name__ == '__main__':
18     p = Myprocess('子進程')
19     p.start()  # 僅僅只是向操作系統發送一個創造子進程的信號
20     p.join()
21     print('')

終端列印:

 

 join方法

 1 from multiprocessing import Process
 2 import time
 3 
 4 
 5 def task(name, n):
 6     print('%s is running' % name)
 7     time.sleep(n)
 8     print('%s is done' % name)
 9 
10 
11 if __name__ == '__main__':
12     start = time.time()
13     p_l = []
14     for i in range(1, 4):
15         p = Process(target=task, args=('子進程%s' % i, i))
16         p_l.append(p)
17         p.start()
18 
19     for p in p_l:
20         p.join()
21     stop = time.time()
22     print('', (stop - start))

 終端列印:

 

 進程之間記憶體隔離

 1 from multiprocessing import Process
 2 
 3 n = 100
 4 
 5 
 6 def task():
 7     global n
 8     n = 0
 9 
10 
11 if __name__ == '__main__':
12     p = Process(target=task, )
13     p.start()
14     p.join()
15     print('', n)

 終端列印:

 

 進程的PID

 1 from multiprocessing import Process, current_process
 2 import time, os
 3 
 4 
 5 def task():
 6     print('子進程[%s]  父進程<%s>' % (os.getpid(), os.getppid()))
 7     time.sleep(300)
 8 
 9 
10 if __name__ == '__main__':
11     p = Process(target=task)
12     p.start()
13     print('', os.getpid(), os.getppid())
14     time.sleep(1000)

終端列印:

 

 

 進程對象其他相關的屬性或方法

 p.name 更改子進程的名字

 1 from multiprocessing import Process
 2 import time, os
 3 
 4 
 5 def task():
 6     print('%s is running' % os.getppid())
 7     time.sleep(300)
 8 
 9 
10 if __name__ == '__main__':
11     p = Process(target=task, name='子進程1')
12     p.start()
13     print(p.name)
14     print('')
15     time.sleep(1000)

 終端列印:

 

terminate與is_alive

  p.terminate()  關閉進程

  p.is_alive()  查看進程是否存活

 1 from multiprocessing import Process
 2 import time, os
 3 
 4 
 5 def task():
 6     print('%s is running' % os.getppid())
 7     time.sleep(300)
 8 
 9 
10 if __name__ == '__main__':
11     p = Process(target=task, name='子進程1')
12     p.start()
13     p.terminate()
14     time.sleep(0.1)
15     print(p.is_alive())
16     print('')

 終端列印:

 


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

-Advertisement-
Play Games
更多相關文章
  • 俗話說 「不要重覆造輪子」,關於是否有必要不再本次討論範圍。 創建這個項目的主要目的還是提升自己,看看和知名類開源項目的差距以及學習優秀的開源方式。 ...
  • 持續集成(Continuous Integration)指的是,頻繁地(一天多次)將代碼集成到主幹。 持續集成的目的,就是讓產品可以快速迭代,同時還能保持高質量。 它的核心措施是,代碼集成到主幹之前,必須通過自動化測試。只要有一個測試用例失敗,就不能集成。 持續集成可以把工程師從繁瑣的任務中解放出來 ...
  • fail-fast機制即為快速失敗機制,個人認為是一種防護措施,在集合結構發生改變的時候,使盡全力拋出ConcurrentModificationException,所以該機制大部分用途都是用來檢測Bug的; 下麵的代碼可以引發fail-fast fail-fast原理 每個集合都會實現可遍歷的介面 ...
  • 在日常的Java開發中,位運算使用的不多,使用的更多的是算數運算(+、-、*、/、%)、關係運算(<、>、<=、>=、==、!=)和邏輯運算(&&、||、!),所以相對來說對位運算不是那麼熟悉,本文將以Java的位運算來詳細介紹下位運算及其應用。 1、 位運算起源 位運算起源於C語言的低級操作,Ja ...
  • 1.分散式 把一個項目拆成幾個部分,然後分別交給不同的人或部門去完成,部門與部門之間互相團結協作共同完成這個大項目。 2.集群 集群就是大家一起幹活,負載均衡就是每個人乾的都差不多(在同一個項目里),不能把某個人累死,也不能讓某個人閑死。 3.反向代理 就是把不同的活分給不同的人去做。 4.散列表、 ...
  • (一)說明 這裡我是按自己的理解去實現的,時間複雜度和空間複雜度和演算法導論上的可能不一樣,感興趣的話參考下就行,感覺最重要的還是演算法思想。根據演算法性能去實現演算法以後再研究。 (二)計數排序 計數排序的基本思想是:對每一個輸人元素x,確定小於x 的元素個數。 利用這一信息,就 可以直接把x放到它在輸出 ...
  • 前言 說一個自己經歷過的事情,有一次我在開發一個通過csv文件批量導入交易的job的時候,在UAT環境上進行性能測試,發現執行失敗了。通過查看日誌發現,機器空間不足了, df h 一看發現32G的機器只有20k的空間,然後一看日誌文件的大小,就占了20G。日誌這東西,不能記得太多,不然影響性能而且占 ...
  • [TOC] 翻譯自《Demo Week: Tidy Time Series Analysis with tibbletime》 原文鏈接:www.business science.io/code tools/2017/10/26/demo_week_tibbletime.html 註意:由於軟體包的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...