【2020Python修煉記】python併發編程(一)多進程

来源:https://www.cnblogs.com/bigorangecc/archive/2020/04/22/12750583.html
-Advertisement-
Play Games

【目錄】 一、操作系統發展史 二、進程發展史及演算法演變 三、多道技術 四、同步非同步/阻塞非阻塞概念 五、創建進程的兩種方式 一、操作系統發展史 1、第一代電腦(1940~1955):真空管和穿孔卡片 (1)特點: 沒有操作系統的概念 所有的程式設計都是直接操控硬體 (2)優點:程式員在申請的時間段 ...


【目錄】

一、什麼是進程

二、進程與程式的區別

三、進程的並行與併發

四、多道技術

五、同步 、非同步 / 阻塞、非阻塞的概念

六、創建進程的兩種方式

 

一、什麼是進程(Process)

# 進程(Process)是電腦中的程式關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。

簡單地說,進程 就是 正在進行的一個過程或者說一個任務。而負責執行任務則是cpu

早期面向進程設計的電腦結構中,進程是程式的基本執行實體

當代面向線程設計的電腦結構中,進程是線程的容器。程式是指令、數據及其組織形式的描述,進程是程式的實體。

# 狹義定義:進程是正在運行的程式的實例(an instance of a computer program that is being executed)。

# 廣義定義:進程是一個具有一定獨立功能的程式關於某個數據集合的一次運行活動。

# 操作系統引進進程概念的原因:

從理論角度看,是對正在運行的程式過程的抽象;

從實現角度看,是一種數據結構,目的在於清晰地刻畫動態系統的內在規律,有效管理和調度進入電腦系統主存儲器運行的程式。

 

二、進程與程式的區別

程式僅僅只是一堆代碼而已,而進程指的是程式的運行過程

需要強調的是:同一個程式執行兩次,那也是兩個進程,比如打開暴風影音,雖然都是同一個軟體,但是一個可以播放李健,一個可以播放周傑倫。

三、進程的並行與併發             

 

(1)並行 : 並行是指兩者同時執行

    只有具備多個cpu才能實現並行;資源夠用,比如三個線程,四核的CPU )

比如賽跑,兩個人都在不停的往前跑。

(2)併發 : 併發是指資源有限的情況下,兩者交替輪流使用資源

    併發是偽並行,即看起來是同時運行。單個cpu+多道技術就可以實現併發,(並行也屬於併發

比如一段路(單核CPU資源)同時只能過一個人,A走一段後,讓給B,B用完繼續給A ,交替使用,目的是提高效率。

(3)區別:

  並行是從微觀上,也就是在一個精確的時間片刻,有不同的程式在執行,這就要求必須有多個處理器。
  併發是從巨集觀上,在一個時間段上可以看出是同時執行的,比如一個伺服器同時處理多個session。

 

四、多道技術——空間上的復用+時間上的復用

1.產生背景:針對單核,實現併發

ps: 現在的主機一般是多核,那麼每個核都會利用多道技術 有4個cpu,運行於cpu1的某個程式遇到io阻塞,

  會等到io結束再重新調度,會被調度到4個 cpu中的任意一個,具體由操作系統調度演算法決定。

2.空間上的復用:如記憶體中同時有多道程式

3.時間上的復用:復用一個cpu的時間片

 

 

強調:遇到io切,占用cpu時間過長也切,核心在於切之前將進程的狀態保存下來,

   這樣 才能保證下次切換回來時,能基於上次切走的位置繼續運行

 

五、同步 、非同步 / 阻塞、非阻塞的概念

 

1、進程三態——就緒態,運行態,阻塞態

                     

 

在程式運行的過程中,由於被操作系統的調度演算法控制,程式會進入幾個狀態:就緒,運行和阻塞。

(1)就緒(Ready)狀態

  當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的進程狀態稱為就緒狀態。

(2)執行/運行(Running)狀態

  當進程已獲得處理機,其程式正在處理機上執行,此時的進程狀態稱為執行狀態。

(3)阻塞(Blocked)狀態

  正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起進程阻塞的事件可有多種,

  例如,等待I/O完成、申請緩衝區不能滿足、等待信件(信號)等。

 

 

 

2、同步/非同步——描述的是任務的提交方式,即 針對的是函數/任務的調用方式

(1)所謂同步,就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麼成功都成功,失敗都失敗,兩個任務的狀態可以保持一致。

即 在發出一個功能調用時,在沒有得到結果之前,該調用就不會返回。

  ——例如:啥也不幹,乾等著你,等你一起吃飯  

(2)所謂非同步,是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。至於被依賴的任務最終是否真正完成,依賴它的任務無法確定,所以它是不可靠的任務序列

即 非同步的概念和同步相對。當一個非同步功能調用發出後,調用者不能立刻得到結果。當該非同步功能完成後,通過狀態、通知或回調來通知調用者。

  ——例如:通知你去吃飯,然後自己先忙別的,等你忙完了再決定吃不吃飯

 

3、阻塞/非阻塞——描述的程式的運行狀態,即 針對的是進程或線程

阻塞和非阻塞,這兩個概念與程式(線程)等待消息通知(無所謂同步或者非同步)時的狀態有關。

也就是說阻塞與非阻塞主要是程式(線程)等待消息通知時的狀態角度來說的

 (1)阻塞

# 阻塞調用是指調用結果返回之前,當前線程會被掛起(如遇到io操作)。函數只有在得到結果之後才會將阻塞的線程激活。

有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。

#舉例:

#1. 同步調用:apply一個累計1億次的任務,該調用會一直等待,直到任務返回結果為止,但並未阻塞住(即便是被搶走cpu的執行許可權,那也是處於就緒態);

#2. 阻塞調用:當socket工作在阻塞模式的時候,如果沒有數據的情況下調用recv函數,則當前線程就會被掛起,直到有數據為止。

(2)非阻塞

# 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前也會立刻返回,同時該函數不會阻塞當前線程。

 

五、創建進程的兩種方式

 1、類實例化產生對象

# 第一種
from multiprocessing import Process
import time

def task(name):
    print('%s is running'%name)
    time.sleep(3)
    print('%s is over'%name)


if __name__ == '__main__':
    # 1 創建一個對象
    p = Process(target=task, args=('jason',))
# 容器類型哪怕裡面只有1個元素 建議要用逗號隔開 # 2 開啟進程 p.start() # 告訴操作系統幫你創建一個進程 非同步 print('') """ windows操作系統下 創建進程一定要在main內創建 因為windows下創建進程類似於模塊導入的方式 會從上往下依次執行代碼
linux中則是直接將代碼完整的拷貝一份
"""

 

2、類的繼承  run方法

# 第二種方式 類的繼承
from multiprocessing import Process
import time


class MyProcess(Process):
    def run(self):
        print('hello bf girl')
        time.sleep(1)
        print('get out!')


if __name__ == '__main__':
    p = MyProcess()
    p.start()
    print('')

 

 

 

參考資料:

https://www.cnblogs.com/Dominic-Ji/articles/10929384.html

https://zhuanlan.zhihu.com/p/111136095

 


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

-Advertisement-
Play Games
更多相關文章
  • 列表生成式 列表生成式是 python 內置的非常強大的可以用來生成列表的生成式。在學習生成器之前先來瞭解一下列表生成式,者有利於我們隊生成器的理解。 列表生成式的語法格式如下 [exp for iter_var in iterable if_exp]另外要註意:不管你是為了Python就業還是興趣 ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 199. 二叉樹的右視圖 題目 給定一棵二叉樹,想象自己站在它 ...
  • 內置函數 內置函數就是python給你提供的, 拿來直接用的函數, 比如print., input等. 截止到python版本3.6.2 python一共提供了68個內置函數. #68個內置函數 # abs() dict() help() min() setattr() # all() dir() ...
  • 很多時候我們自己編寫一個類,在將它的實例在終端上列印或查看的時候,我們往往會看到一個不太滿意的結果。所以,我們可能會手動列印對象的一些屬性或者是在類里自己實現一個方法來返回我們需要的信息。 使用__str__方法實現類到字元串的轉化 class Car: def __init__(self, col ...
  • 本文講解了單文件,多文件上傳,然後對文件的上傳限制條件與訪問添加了一些配置。 ...
  • `@SessionAttributes` 註解只用作用在 類 上,作用是將指定的 Model 的鍵值對保存在 session 中。可以讓其他請求共用 session 中的鍵值對。 指定保存的屬性名 作用是將 Model 中指定 屬性名 的鍵值對保存在 session 中。 下麵的代碼中, 請求將 M ...
  • 當下,Python 比以往的任何時候都更加流行,人們每天都在實踐著 Python 是多麼的強大且易用。 我從事 Python 編程已經有幾年時間了,但是最近6個月才是全職的。下麵列舉的這些事情,是我最開始使用 Python 的時候,就希望清楚的: 字元串操作 列表推導 Lambda 和 Map 函數 ...
  • 什麼是 Opcache 每一次執行 PHP 腳本的時候,該腳本都需要被編譯成位元組碼,而 OPcache 可以對該位元組碼進行緩存,這樣,下次請求同一個腳本的時候,該腳本就不需要重新編譯,這極大節省了腳本的執行時間,從而讓應用運行速度更快,同時也節省了伺服器的開銷。 用數字說話 我們當然很想知道到底進行 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...