欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析Python中的多進程

 更新時間:2022年06月20日 16:44:26   作者:時代&信念  
這篇文章主要介紹了深入解析Python中的多進程,“Python中的多進程是通過multiprocessing包來實現(xiàn)的,和多線程的threading.Thread差不多,它可以利用multiprocessing.Process對象來創(chuàng)建一個進程對象

前言

現(xiàn)在我們的計算機都是多個核的,通俗來說就是多個處理或者計算單元。為了加快運算和處理速度,我們可以將不同的任務交給多個核心進行同時處理,從而提高了運算速度和效率,多個核心同時運作就是多個進程同時進行,這就是多進程。

1.創(chuàng)建進程

創(chuàng)建進程和創(chuàng)建線程的方法基本一致,請看下面代碼:

# coding:utf-8
# 導入多進程的包,并重命名為mp
import multiprocessing as mp
# 主要工作
def p1():
    print("zxy")
if __name__ == "__main__":
    # 創(chuàng)建新進程
    new_process = mp.Process(target=p1, name="p1")
    # 啟動這個進程
    new_process.start()
    # 阻塞該進程
    new_process.join()

控制臺效果圖:

2.多進程中的Queue

為什么要在多進程中使用queue呢?
因為多進程和多線程一樣,在工作函數(shù)中,無法通過return返回進程函數(shù)中的結(jié)果,所以使用queue進行存儲結(jié)果,要用的時候再進行取出。

# coding:utf-8
import time
import multiprocessing as mp
"""
    使用多進程時,運行程序所用的時間
"""
def job1(q):
    res = 0
    for i in range(100):
        res += i + i**5 +i**8
        time.sleep(0.1)
    # 將結(jié)果放入隊列中
    q.put(res)
def job2(q):
    res = 0
    for i in range(100):
        res += i + i**5 +i**8
        time.sleep(0.1)
    q.put(res)
if __name__ == "__main__":
    start_time = time.time()
    # 創(chuàng)建隊列
    q = mp.Queue()
    # 創(chuàng)建進程1
    process1 = mp.Process(target=job1, args=(q,))
    # 創(chuàng)建進程2
    process2 = mp.Process(target=job2, args=(q,))
    process1.start()
    process2.start()
    # 通過隊列獲取值
    res1 = q.get()
    res2 = q.get()
    print("res1為%d,res2為%d" % (res1, res2))
    end_time = time.time()
    print("整個過程所用時間為%s" %(end_time-start_time))

效果圖:

3.多進程與多線程的性能比較

接下來使用多進程、多線程、以及什么都不用的普通方法進行處理,看看他們?nèi)N方法的效率如何?

# coding:utf-8
import multiprocessing as mp
import time
import threading as th
"""
    多進程、多線程、普通方法的性能比較
"""
# 多進程工作
def mp_job(res):
    for i in range(10000000):
        res += i**5 + i**6
    print(res)
# 多線程工作
def mt_job(res):
    for i in range(10000000):
        res += i**5 + i**6
    print(res)
# 普通方法工作
def normal_job(res):
    for i in range(10000000):
        res += i ** 5 + i ** 6
    print(res)
if __name__ == "__main__":
    mp_sum = 0
    mp_start = time.time()
    process1 =mp.Process(target=mp_job, args=(mp_sum, ))
    process2 = mp.Process(target=mp_job, args=(mp_sum,))
    process1.start()
    process2.start()
    process1.join()
    process2.join()
    mp_end = time.time()
    print("多進程使用時間為", (mp_end-mp_start))
    mt_start = time.time()
    mt_sum = 0
    thread1 = th.Thread(target=mt_job, args=(mt_sum, ))
    thread2 = th.Thread(target=mt_job, args=(mt_sum, ))
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()
    mt_end = time.time()
    print("多線程使用的時間是", (mt_end-mt_start))
    normal_start = time.time()
    normal_sum = 0
    # 進行兩次
    normal_job(normal_sum)
    normal_job(normal_sum)
    normal_end = time.time()
    print("普通方法使用的時間是", (normal_end-normal_start))

效果圖:

實驗結(jié)果表明:多進程的效率確實高?。?!

4.進程池pool

進程池是干什么用的呢?
進程池就是python的多進程提供的一個池子,將所有的進程都放在這個池子里面,讓計算機自己去使用進程池中的資源,從而多進程處理一些程序,進而提高工作效率。

(1)默認使用進程池中全部進程時

# coding:utf-8
import time
import multiprocessing as mp
"""
    進程池pool的使用
"""
def job(num):
    time.sleep(1)
    return num * num
if __name__ == "__main__":
    start_time = time.time()
    # 括號里面不加參數(shù)時,默認使用進程池中所有進程
    pool = mp.Pool()
    res = pool.map(job, range(10))
    print(res)
    end_time = time.time()
    print("運行時間為", (end_time-start_time))

效果圖:

(2)指定進程池中進程數(shù)時

# coding:utf-8
import time
import multiprocessing as mp
"""
    進程池pool的使用
"""
def job(num):
    time.sleep(1)
    return num * num
if __name__ == "__main__":
    start_time = time.time()
    # 括號里面加參數(shù)時,指定兩個進程進行處理
    pool = mp.Pool(processes=2)
    res = pool.map(job, range(10))
    print(res)
    end_time = time.time()
    print("運行時間為", (end_time-start_time))

效果圖:

(3)不使用多進程時

# coding:utf-8
import time
def job(res):
    for i in range(10):
        res.append(i*i)
        time.sleep(1)
if __name__ == "__main__":
    start_time = time.time()
    res = []
    job(res)
    print(res)
    end_time =time.time()
    print("不使用進程池所用時間為", (end_time-start_time))

效果圖:

實驗結(jié)論:多進程處理事情,效率很高?。?!核心越多,處理越快!

5.共享內(nèi)存

一個核心,我們多線程處理時,可以使用全局變量來共享數(shù)據(jù)。但是多進程之間是不行的,那我們多進程之間應該如何共享數(shù)據(jù)呢?
那就得用到共享內(nèi)存了!

# coding:utf-8
import multiprocessing as mp
"""
    共享內(nèi)存
"""
if __name__ == "__main__":
    # 第一個參數(shù)是數(shù)據(jù)類型的代碼,i代表整數(shù)類型
    # 第二個參數(shù)是共享數(shù)據(jù)的值
    v = mp.Value("i", 0)

6.進程鎖lock

進程鎖和線程鎖的用法基本一致。進程鎖的誕生是為了避免多進程之間搶占共享數(shù)據(jù),進而造成多進程之間混亂修改共享內(nèi)存的局面。

(1)不加鎖之前

# coding:utf-8
import multiprocessing as mp
import time
"""
    進程中的鎖lock
"""
def job(v, num):
    for i in range(10):
        v.value += num
        print(v.value)
        time.sleep(0.2)
if __name__ == "__main__":
    # 多進程中的共享內(nèi)存
    v = mp.Value("i", 0)
    # 進程1讓共享變量每次加1
    process1 = mp.Process(target=job, args=(v, 1))
    # 進程2讓共享變量每次加3
    process2 = mp.Process(target=job, args=(v, 3))
    process1.start()
    process2.start()

效果圖:

(2)加鎖之后

# coding:utf-8
import multiprocessing as mp
import time
"""
    進程中的鎖lock
"""
def job(v, num, l):
    # 加鎖
    l.acquire()
    for i in range(10):
        v.value += num
        print(v.value)
        time.sleep(0.2)
    # 解鎖
    l.release()
if __name__ == "__main__":
    # 創(chuàng)建進程鎖
    l = mp.Lock()
    # 多進程中的共享內(nèi)存
    v = mp.Value("i", 0)
    process1 = mp.Process(target=job, args=(v, 1, l))
    process2 = mp.Process(target=job, args=(v, 3, l))
    process1.start()
    process2.start()

效果圖:

到此這篇關于深入解析Python中的多進程的文章就介紹到這了,更多相關Python多進程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 表格梳理python內(nèi)置數(shù)學模塊math分析詳解

    表格梳理python內(nèi)置數(shù)學模塊math分析詳解

    這篇文章主要為大家介紹了python內(nèi)置數(shù)學模塊math的分析詳解,文中通過表格梳理的方式以便讓大家在學習過程中一目望去清晰明了,有需要的朋友可以借鑒參考下
    2021-10-10
  • Django框架模板語言實例小結(jié)【變量,標簽,過濾器,繼承,html轉(zhuǎn)義】

    Django框架模板語言實例小結(jié)【變量,標簽,過濾器,繼承,html轉(zhuǎn)義】

    這篇文章主要介紹了Django框架模板語言,結(jié)合實例形式總結(jié)分析了Django框架中變量,標簽,過濾器,繼承,html轉(zhuǎn)義等相關模板語言操作技巧,需要的朋友可以參考下
    2019-05-05
  • Django 日志配置按日期滾動的方法

    Django 日志配置按日期滾動的方法

    今天小編就為大家分享一篇Django 日志配置按日期滾動的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 使用Termux在手機上運行Python的詳細過程

    使用Termux在手機上運行Python的詳細過程

    這篇文章主要介紹了使用Termux在手機上運行Python的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • python logging 重復寫日志問題解決辦法詳解

    python logging 重復寫日志問題解決辦法詳解

    這篇文章主要介紹了python logging 重復寫日志問題解決辦法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Python中的迭代器你了解嗎

    Python中的迭代器你了解嗎

    迭代器是一種特殊的對象,它實現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個訪問元素,本文就來帶大家深入了解一下Python中迭代器的使用,需要的可以參考下
    2023-05-05
  • 簡單實現(xiàn)python數(shù)獨游戲

    簡單實現(xiàn)python數(shù)獨游戲

    這篇文章主要為大家詳細介紹了如何簡單實現(xiàn)python數(shù)獨游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python函數(shù)指定默認值的實例講解

    python函數(shù)指定默認值的實例講解

    在本篇內(nèi)容里小編給大家整理了一篇關于python函數(shù)指定默認值的實例講解內(nèi)容,有需要的朋友們可以跟著學習參考下。
    2021-03-03
  • Python?opencv進行圓形識別(圓檢測)實例代碼

    Python?opencv進行圓形識別(圓檢測)實例代碼

    最近工作的項目上需要檢測圖像中是否有圓形,下面這篇文章主要給大家介紹了關于Python?opencv進行圓形識別(圓檢測)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Pytorch釋放顯存占用方式

    Pytorch釋放顯存占用方式

    今天小編就為大家分享一篇Pytorch釋放顯存占用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評論