亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python程序中的進(jìn)程操作-進(jìn)程同步(multiprocess.Lock)

系統(tǒng) 1921 0

目錄

  • 一、多進(jìn)程搶占輸出資源
  • 二、使用鎖維護(hù)執(zhí)行順序
  • 三、多進(jìn)程同時(shí)搶購(gòu)余票
  • 四、使用鎖來(lái)保證數(shù)據(jù)安全

通過(guò)剛剛的學(xué)習(xí),我們千方百計(jì)實(shí)現(xiàn)了程序的異步,讓多個(gè)任務(wù)可以同時(shí)在幾個(gè)進(jìn)程中并發(fā)處理,他們之間的運(yùn)行沒(méi)有順序,一旦開(kāi)啟也不受我們控制。盡管并發(fā)編程讓我們能更加充分的利用IO資源,但是也給我們帶來(lái)了新的問(wèn)題: 當(dāng)多個(gè)進(jìn)程使用同一份數(shù)據(jù)資源的時(shí)候,就會(huì)引發(fā)數(shù)據(jù)安全或順序混亂問(wèn)題。

一、多進(jìn)程搶占輸出資源

          
            import os
import time
import random
from multiprocessing import Process

def work(n):
    print('%s: %s is running' %(n,os.getpid()))
    time.sleep(random.random())
    print('%s:%s is done' %(n,os.getpid()))

if __name__ == '__main__':
    for i in range(3):
        p=Process(target=work,args=(i,))
        p.start()
          
        

二、使用鎖維護(hù)執(zhí)行順序

          
            # 由并發(fā)變成了串行,犧牲了運(yùn)行效率,但避免了競(jìng)爭(zhēng)
import os
import time
import random
from multiprocessing import Process,Lock

def work(lock,n):
    lock.acquire()
    print('%s: %s is running' % (n, os.getpid()))
    time.sleep(random.random())
    print('%s: %s is done' % (n, os.getpid()))
    lock.release()
if __name__ == '__main__':
    lock=Lock()
    for i in range(3):
        p=Process(target=work,args=(lock,i))
        p.start()
          
        

上面這種情況雖然使用加鎖的形式實(shí)現(xiàn)了順序的執(zhí)行, 但是程序又重新變成串行了, 這樣確實(shí)會(huì)浪費(fèi)了時(shí)間,卻保證了數(shù)據(jù)的安全。

接下來(lái),我們以模擬搶票為例,來(lái)看看數(shù)據(jù)安全的重要性。

三、多進(jìn)程同時(shí)搶購(gòu)余票

          
            # 文件db的內(nèi)容為:{"count":1}
# 注意一定要用雙引號(hào),不然json無(wú)法識(shí)別
# 并發(fā)運(yùn)行,效率高,但競(jìng)爭(zhēng)寫(xiě)同一文件,數(shù)據(jù)寫(xiě)入錯(cuò)亂
from multiprocessing import Process,Lock
import time,json,random
def search():
    dic=json.load(open('db'))
    print('剩余票數(shù)%s' %dic['count'])

def get():
    dic=json.load(open('db'))
    time.sleep(0.1)  # 模擬讀數(shù)據(jù)的網(wǎng)絡(luò)延遲
    if dic['count'] >0:
        dic['count']-=1
        time.sleep(0.2)  # 模擬寫(xiě)數(shù)據(jù)的網(wǎng)絡(luò)延遲
        json.dump(dic,open('db','w'))
        print('購(gòu)票成功')

def task():
    search()
    get()

if __name__ == '__main__':
    for i in range(100):  # 模擬并發(fā)100個(gè)客戶端搶票
        p=Process(target=task)
        p.start()
          
        

四、使用鎖來(lái)保證數(shù)據(jù)安全

          
            # 文件db的內(nèi)容為:{"count":5}
# 注意一定要用雙引號(hào),不然json無(wú)法識(shí)別
# 并發(fā)運(yùn)行,效率高,但競(jìng)爭(zhēng)寫(xiě)同一文件,數(shù)據(jù)寫(xiě)入錯(cuò)亂
from multiprocessing import Process,Lock
import time,json,random
def search():
    dic=json.load(open('db'))
    print('剩余票數(shù)%s' %dic['count'])

def get():
    dic=json.load(open('db'))
    time.sleep(random.random())  # 模擬讀數(shù)據(jù)的網(wǎng)絡(luò)延遲
    if dic['count'] >0:
        dic['count']-=1
        time.sleep(random.random())  # 模擬寫(xiě)數(shù)據(jù)的網(wǎng)絡(luò)延遲
        json.dump(dic,open('db','w'))
        print('購(gòu)票成功')
    else:
        print('購(gòu)票失敗')

def task(lock):
    search()
    lock.acquire()
    get()
    lock.release()

if __name__ == '__main__':
    lock = Lock()
    for i in range(100):  # 模擬并發(fā)100個(gè)客戶端搶票
        p=Process(target=task,args=(lock,))
        p.start()
          
        

加鎖可以保證多個(gè)進(jìn)程修改同一塊數(shù)據(jù)時(shí),同一時(shí)間只能有一個(gè)任務(wù)可以進(jìn)行修改,即串行的修改, 沒(méi)錯(cuò),速度是慢了,但犧牲了速度卻保證了數(shù)據(jù)安全。

雖然可以用文件共享數(shù)據(jù)實(shí)現(xiàn)進(jìn)程間通信,但問(wèn)題是:

  1. 效率低(共享數(shù)據(jù)基于文件,而文件是硬盤(pán)上的數(shù)據(jù))
  2. 需要自己加鎖處理

因此我們最好找尋一種解決方案能夠兼顧:

  1. 效率高(多個(gè)進(jìn)程共享一塊內(nèi)存的數(shù)據(jù))
  2. 幫我們處理好鎖問(wèn)題。這就是mutiprocessing模塊為我們提供的基于消息的IPC通信機(jī)制:隊(duì)列和管道。

隊(duì)列和管道都是將數(shù)據(jù)存放于內(nèi)存中,隊(duì)列又是基于(管道+鎖)實(shí)現(xiàn)的,可以讓我們從復(fù)雜的鎖問(wèn)題中解脫出來(lái), 我們應(yīng)該盡量避免使用共享數(shù)據(jù),盡可能使用消息傳遞和隊(duì)列, 避免處理復(fù)雜的同步和鎖問(wèn)題,而且在進(jìn)程數(shù)目增多時(shí),往往可以獲得更好的可獲展性。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品嘿咻嘿咻在线播放 | 久久国产精品男女热播 | 亚洲国产精品乱码在线观看97 | 精品久久久中文字幕二区 | 一本久道热中字伊人 | 91成人在线播放 | 欧美日韩一区二区三区自拍 | 久久精品国产久精国产 | 一级肉体毛片视频免费看看 | 国产综合成色在线视频 | 狠狠狠狠狠狠干 | 亚洲天堂不卡 | 四虎最新紧急入口4hu | 91精品国产人成网站 | 国产精品福利久久 | 国产成人精视频在线观看免费 | 欧美18—19sex性护士 | 亚洲国产成人在线视频 | 四虎影视在线观看永久地址 | www免费视频com| 久热精品视频 | 免费黄色福利视频 | 亚洲精品久久久久综合中文字幕 | 91热国内精品永久免费观看 | 深夜福利国产精品亚洲尤物 | 尤物精品视频在线观看 | 一级毛片秋霞特色大片 | 久久99青青久久99久久 | 日本亚洲精品成人 | 非洲一级毛片 | 国产福利精品在线 | 久久草在线看 | 久久乐国产综合亚洲精品 | 亚洲精品日本一区二区在线 | 福利在线看 | 国产成人久久综合二区 | 亚洲国产系列久久精品99人人 | 亚洲国产精久久久久久久 | 最新福利在线 | 九九99久久精品影视 | 日本aaaa级毛片在线看 |