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

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

系統 2282 0

目錄

  • 一、多進程搶占輸出資源
  • 二、使用鎖維護執行順序
  • 三、多進程同時搶購余票
  • 四、使用鎖來保證數據安全

通過剛剛的學習,我們千方百計實現了程序的異步,讓多個任務可以同時在幾個進程中并發處理,他們之間的運行沒有順序,一旦開啟也不受我們控制。盡管并發編程讓我們能更加充分的利用IO資源,但是也給我們帶來了新的問題: 當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂問題。

一、多進程搶占輸出資源

          
            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()
          
        

二、使用鎖維護執行順序

          
            # 由并發變成了串行,犧牲了運行效率,但避免了競爭
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()
          
        

上面這種情況雖然使用加鎖的形式實現了順序的執行, 但是程序又重新變成串行了, 這樣確實會浪費了時間,卻保證了數據的安全。

接下來,我們以模擬搶票為例,來看看數據安全的重要性。

三、多進程同時搶購余票

          
            # 文件db的內容為:{"count":1}
# 注意一定要用雙引號,不然json無法識別
# 并發運行,效率高,但競爭寫同一文件,數據寫入錯亂
from multiprocessing import Process,Lock
import time,json,random
def search():
    dic=json.load(open('db'))
    print('剩余票數%s' %dic['count'])

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

def task():
    search()
    get()

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

四、使用鎖來保證數據安全

          
            # 文件db的內容為:{"count":5}
# 注意一定要用雙引號,不然json無法識別
# 并發運行,效率高,但競爭寫同一文件,數據寫入錯亂
from multiprocessing import Process,Lock
import time,json,random
def search():
    dic=json.load(open('db'))
    print('剩余票數%s' %dic['count'])

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

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

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

加鎖可以保證多個進程修改同一塊數據時,同一時間只能有一個任務可以進行修改,即串行的修改, 沒錯,速度是慢了,但犧牲了速度卻保證了數據安全。

雖然可以用文件共享數據實現進程間通信,但問題是:

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

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

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

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线免费午夜视频 | 日日噜噜夜夜狠狠久久丁香 | 日韩亚洲一区中文字幕在线 | 青青久 | 婷婷综合久久中文字幕 | 亚洲高清免费在线观看 | 99爱视频精品免视看 | 国产一级特黄特色aa毛片 | 亚州毛色毛片免费观看 | 中文字幕一区二区三区免费视频 | 久久久久国产视频 | 日韩在线观看中文字幕 | 一级不卡毛片免费 | 免费看一级特黄a大片 | 免费在线观看黄色毛片 | 99久久精品免费看国产 | 最新国产精品久久精品 | 老司机日日摸夜夜摸精品影院 | 波多野结衣中文丝袜字幕 | 香蕉久久网站 | 91视频最新地址 | 欧洲成人全免费视频网站 | 中文字幕日韩女同互慰视频 | 欧美精品99久久久久久人 | 91欧美在线 | 国产色婷婷精品综合在线观看 | 最近中文字幕无吗免费视频 | 人人爽天天爽 | 亚洲一区二区三区影院 | 亚洲 欧美 卡通 在线 另类 | 国产精品亚洲国产 | 欧美色欧美亚洲高清在线观看 | 精品国产a| 亚洲春色综合另类网蜜桃 | 奇米在线播放 | 国产精品网址你懂的 | 美女日日日| 在线观看 一区 | 亚洲国产天堂在线mv网站 | 伊人第一页 | 欧美成人免费高清二区三区 |