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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...