亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入解析Python中的多進(jìn)程

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

前言

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

1.創(chuàng)建進(jìn)程

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

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

控制臺(tái)效果圖:

2.多進(jìn)程中的Queue

為什么要在多進(jìn)程中使用queue呢?
因?yàn)槎噙M(jìn)程和多線(xiàn)程一樣,在工作函數(shù)中,無(wú)法通過(guò)return返回進(jìn)程函數(shù)中的結(jié)果,所以使用queue進(jìn)行存儲(chǔ)結(jié)果,要用的時(shí)候再進(jìn)行取出。

# coding:utf-8
import time
import multiprocessing as mp
"""
    使用多進(jìn)程時(shí),運(yùn)行程序所用的時(shí)間
"""
def job1(q):
    res = 0
    for i in range(100):
        res += i + i**5 +i**8
        time.sleep(0.1)
    # 將結(jié)果放入隊(duì)列中
    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)建隊(duì)列
    q = mp.Queue()
    # 創(chuàng)建進(jìn)程1
    process1 = mp.Process(target=job1, args=(q,))
    # 創(chuàng)建進(jìn)程2
    process2 = mp.Process(target=job2, args=(q,))
    process1.start()
    process2.start()
    # 通過(guò)隊(duì)列獲取值
    res1 = q.get()
    res2 = q.get()
    print("res1為%d,res2為%d" % (res1, res2))
    end_time = time.time()
    print("整個(gè)過(guò)程所用時(shí)間為%s" %(end_time-start_time))

效果圖:

3.多進(jìn)程與多線(xiàn)程的性能比較

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

# coding:utf-8
import multiprocessing as mp
import time
import threading as th
"""
    多進(jìn)程、多線(xiàn)程、普通方法的性能比較
"""
# 多進(jìn)程工作
def mp_job(res):
    for i in range(10000000):
        res += i**5 + i**6
    print(res)
# 多線(xiàn)程工作
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("多進(jìn)程使用時(shí)間為", (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("多線(xiàn)程使用的時(shí)間是", (mt_end-mt_start))
    normal_start = time.time()
    normal_sum = 0
    # 進(jìn)行兩次
    normal_job(normal_sum)
    normal_job(normal_sum)
    normal_end = time.time()
    print("普通方法使用的時(shí)間是", (normal_end-normal_start))

效果圖:

實(shí)驗(yàn)結(jié)果表明:多進(jìn)程的效率確實(shí)高!?。?/p>

4.進(jìn)程池pool

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

(1)默認(rèn)使用進(jìn)程池中全部進(jìn)程時(shí)

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

效果圖:

(2)指定進(jìn)程池中進(jìn)程數(shù)時(shí)

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

效果圖:

(3)不使用多進(jìn)程時(shí)

# 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("不使用進(jìn)程池所用時(shí)間為", (end_time-start_time))

效果圖:

實(shí)驗(yàn)結(jié)論:多進(jìn)程處理事情,效率很高!?。『诵脑蕉?,處理越快!

5.共享內(nèi)存

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

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

6.進(jìn)程鎖lock

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

(1)不加鎖之前

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

效果圖:

(2)加鎖之后

# coding:utf-8
import multiprocessing as mp
import time
"""
    進(jìn)程中的鎖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)建進(jìn)程鎖
    l = mp.Lock()
    # 多進(jìn)程中的共享內(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()

效果圖:

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

相關(guān)文章

最新評(píng)論