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

Python并發編程之進程同步

系統 1774 0
          
            
"""
問題:當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂的問題
"""
'''
進程同步
'''
#多進程搶占輸出資源
import os
import time
import random
from multiprocessing import Process

def work(n):
    print(f'{n}: {os.getpid()} is running')
    # time.sleep(random.random())
    time.sleep(2)
    print(f"{n}: {os.getpid()} is done")
if __name__ == '__main__':
 for i in range(3):
     p = Process(target= work, args=(i, ))
     p.start()

#使用鎖維護執行順序

#由并發變成了串行,犧牲了運行效率,但避免了競爭
import os,time,random
from multiprocessing import Process,Lock

def work(lock, n):
    lock.acquire()
    print(f'{n}: {os.getpid()} is running')
    time.sleep(random.randint(1, 3))
    print(f'{n}: {os.getpid()} is done')
    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')) #從文件中把數據讀出來
    # 下面兩句和上面一句的功能一樣
    # data = open('db')
    # dic = json.load(data)
    print(f'剩余票數{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'))
        # 下面兩句和上面一句會得到相同的效果
        # data = open('db', 'w')
        # json.dump(dic, data)
        print('購票成功')
def task():
    search()
    get()

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


#用鎖來保證數據安全
from multiprocessing import Process,Lock
import time, json, random

def search():#查詢剩余票數
    dic = json.load(open('db')) #從文件中把數據讀出來
    # 下面兩句和上面一句的功能一樣
    # data = open('db')
    # dic = json.load(data)
    print(f'剩余票數{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'))
        # 下面兩句和上面一句會得到相同的效果
        # data = open('db', 'w')
        # json.dump(dic, data)
        print('購票成功')
def task(lock):
    search()
    lock.acquire()
    get()
    lock.release()

if __name__ == '__main__':
    lock = Lock()
    for i in range(30): # 模擬并發30個客戶端搶票
        p = Process(target=task, args=(lock, ))
        p.start()
"""
加鎖可以保證多個進程修改同一塊數據時,同一時間只
能有一個任務可以修改即串行的修改,速度慢了,但是數
據變安全了。

文件共享數據實現進程間通信,問題有:
1.效率低(共享數據基于文件,而文件是在硬盤上的數據) 
2.需要自己加鎖處理

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

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

"""
          
        

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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月婷婷色网 | 色婷婷久久综合中文久久一本 | 亚洲精品性夜夜夜 | 男女车车好快的车车免费网站 | 一级视频片 | 国产精品9999 | 不卡在线观看 | chinese456老人gay| 久久免费资源福利资源站 | 国产欧美日韩亚洲精品区2345 | 视频国产91 | 日韩中文字幕网 | 日韩中文字幕视频在线 | 亚洲一区二区三区成人 | 中文在线视频 | 福利影院在线播放 | 夜夜爽夜夜叫夜夜高潮漏水 | 欧美精品亚洲一区二区在线播放 | 国内毛片视频 | 欧美日韩国产在线观看 | 午夜网站在线观看免费网址免费 | 黄动漫在线无限看免费 | 精品看片| 日韩亚洲一区二区三区 | 九九九精品午夜在线观看 | 好看的中文字幕在线 | 99视频精品全部国产盗摄视频 | 久久www免费人成看国产片 | 国产精品久久久久一区二区三区 | 亚洲国产中文字幕在线观看 | 国产成人久久综合二区 | 欧美伊人 | 成人国产精品一级毛片了 | 久久免费视频在线观看30 | 乱子伦免费视频中文字幕 | 国产一区二区三区在线 | 农村妇女高清毛片一级 | 97在线免费视频观看 | 97影院午夜在线观看琪琪 | 欧美日韩成人在线观看 | 久久精品视频免费在线观看 |