python基礎學習21----進程

来源:https://www.cnblogs.com/sfencs-hcy/archive/2018/10/05/9744946.html
-Advertisement-
Play Games

python中的多線程其實並不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。 進程與線程的使用有很多相似之處,有關線程方面的知識請參考https://www.cnblogs.com/sfencs-hcy/p/9721362.html multiproc ...


python中的多線程其實並不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。

進程與線程的使用有很多相似之處,有關線程方面的知識請參考https://www.cnblogs.com/sfencs-hcy/p/9721362.html

multiprocessing模塊

1.進程的創建

import multiprocessing

def func(msg):
    print(msg)
    print("這是一個進程")
if __name__=="__main__":
    p=multiprocessing.Process(target=func,args=("hello world",))
    p.start()

  以繼承類的方式創建進程

import multiprocessing
class Myprocessing(multiprocessing.Process):
    def __init__(self,name,age):
        multiprocessing.Process.__init__(self)
        self.name=name
        self.age=age

    def run(self):
        #這裡是將threading.Thread中的run方法進行了重載
       print("%s is %d"%(self.name,self.age))
if __name__=="__main__":
    t=Myprocessing("sfencs",19)
    t.start()

2.進程的並行

import multiprocessing
import time
class Myprocessing(multiprocessing.Process):
    def __init__(self,name,age,second):
        multiprocessing.Process.__init__(self)
        self.name=name
        self.second=second
        self.age=age

    def run(self):
        print(self.name)
        time.sleep(self.second)
        print(self.age)

if __name__=="__main__":
    time_begin=time.time()

    p1=Myprocessing("sfencs",19,2)
    p2=Myprocessing("Tom",25,5)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    time_end=time.time()
    print(time_end-time_begin)
'''
Tom
19
25
5.198107481002808
'''

join的用法和線程相同

3.守護進程

守護進程與守護線程的原理相同,只不過設置守護進程的方式為p.daemon=True

4.lock

lock的作用同多線程,實現方式有兩種

import multiprocessing

def func2(lock,f):
    with lock:
        fs=open(f,'a+')

        fs.write('Lockd acquired via with\n')

        fs.close()
def func1(lock,f):
    lock.acquire()
    fs=open(f,'a+')
    fs.write('Lock acquired directly\n')
    fs.close()

    lock.release()
if __name__=="__main__":
    lock=multiprocessing.Lock()
    f = "file.txt"
    p1=multiprocessing.Process(target=func2,args=(lock,f,))
    p2=multiprocessing.Process(target=func1,args=(lock,f,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

與線程不同的是,這裡lock是以參數方式傳遞,因為不同的進程並不能共用資源

5.Semaphore

用來控制對共用資源的最大訪問數量

import multiprocessing
import time

def func(s, i):
    s.acquire()
    print(multiprocessing.current_process().name + "acquire");
    time.sleep(2)
    print(multiprocessing.current_process().name + "release\n");
    s.release()

if __name__ == "__main__":
    s = multiprocessing.Semaphore(2)
    for i in range(5):
        p = multiprocessing.Process(target = func, args=(s, 2))
        p.start()

6.event與線程用法相同

7.隊列

有一個專門屬於多進程的隊列multiprocessing.Queue

import multiprocessing

def writer(q):
   q.put("hello world")

def reader(q):
    print(q.get())

if __name__ == "__main__":
    q = multiprocessing.Queue()
    pwriter=multiprocessing.Process(target=writer,args=(q,))
    preader = multiprocessing.Process(target=reader, args=(q,))
    pwriter.start()
    preader.start()

8.管道pipe

Pipe方法返回(conn1, conn2)代表一個管道的兩個端。Pipe方法有duplex參數,如果duplex參數為True(預設值),那麼這個管道是全雙工模式,也就是說conn1和conn2均可收發。duplex為False,conn1只負責接受消息,conn2只負責發送消息。

import multiprocessing

def sender(p):
   p.send("hello world")

def receiver(p):
    print(p.recv())

if __name__ == "__main__":
    p = multiprocessing.Pipe()
    psender=multiprocessing.Process(target=sender,args=(p[0],))
    preceiver = multiprocessing.Process(target=receiver, args=(p[1],))
    psender.start()
    preceiver.start()

9.manager

manager實現進程之間數據共用

import multiprocessing

def func(list1,d,i):
    list1[i]=i
    d["a"]=i

if __name__ == "__main__":
    with multiprocessing.Manager() as manager:
        list1=manager.list(range(5,10))
        d=manager.dict()
        plist=[]
        for i in range(5):
            p=multiprocessing.Process(target=func,args=(list1,d,i))
            plist.append(p)
            p.start()
        for i in plist:
            i.join()
        print(list1)
        print(d)

 

未完


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

-Advertisement-
Play Games
更多相關文章
  • 使用json-org包實現POJO和json的轉換 這個jar包把對象轉換成json超級舒服,所以順便記錄一下吧 把單個pojo對象轉換成json對象 把多個pojo對象轉成json數組 ...
  • 鏈接:https://www.nowcoder.com/acm/contest/205/G來源:牛客網 題目描述 終於活成了自己討厭的樣子。 充錢能讓你變得更強。 在暖婊這個游戲裡面,如果你充了x元錢,那麼你能獲得10x個鑽石。同時暖婊也有m檔VIP,如果你往暖婊裡面充了ai個鑽石,那麼你能成為第i ...
  • 摘要:本文是Java基礎教程系列的第一篇文章。主要從什麼是Java語言、Java的特點和Java的發展簡史三個方面對Java進行了介紹,使得讀者在開始學習Java前對其有一個大概的認識。最後分享了幾本筆者認為適合初學者的書籍。 ...
  • #這個可以拿到這個django自帶的User的表,這個是django自己的用戶認證的表(創建超級用戶和普通用戶的表) 原理講解: 這個相當於在session裡面記錄一個session_idrequest.session['user_id']=user[0].id生成特殊的字元串特殊字元串生成key的 ...
  • 這是我們的XML文件,對其進行解析 結果如下 ...
  • Go的sort介面實現 ...
  • 在網上找了各種方法一直也沒配好打開jak下的lib文件夾發現並沒有tools.jar,後經查詢jdk-9後就沒有了上述.jar文件所以我的配置方法如下 ClASSPATH C:\jdk安裝目錄\lib C:\jre安裝目錄\lib Path C:\jdk安裝目錄\bin C:\jre安裝目錄\bin ...
  • CentOS安裝python-pip 在使用Python時,需要導入一些第三方工具包,一般情況下,鼓勵使用pip來安裝管理這些第三方的包, 這裡我們來看一下如何在CentOS 7.2上安裝Python-pip。 第一步,下載python-pip的tar包: # wget https://pypi.p ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...