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

Python并發(fā)編程03/僵尸孤兒進(jìn)程,互斥鎖,進(jìn)程之間的通信

系統(tǒng) 1759 0

目錄

  • Python并發(fā)編程03/僵尸孤兒進(jìn)程,互斥鎖,進(jìn)程之間的通信
    • 1.昨日回顧
    • 2.僵尸進(jìn)程和孤兒進(jìn)程
      • 2.1僵尸進(jìn)程
      • 2.2孤兒進(jìn)程
      • 2.3僵尸進(jìn)程如何解決?
    • 3.互斥鎖,鎖
      • 3.1互斥鎖的應(yīng)用
      • 3.2Lock與join的區(qū)別
    • 4.進(jìn)程之間的通信
      • 進(jìn)程在內(nèi)存級(jí)別是隔離的
      • 4.1基于文件通信 (搶票系統(tǒng))
      • 4.2基于隊(duì)列通信

Python并發(fā)編程03/僵尸孤兒進(jìn)程,互斥鎖,進(jìn)程之間的通信

1.昨日回顧

          
            1.創(chuàng)建進(jìn)程的兩種方式: 函數(shù), 類.
2.pid: os.getpid()  os.getppid()
  tasklist 
  tasklist| findstr  進(jìn)程名
3.進(jìn)程與進(jìn)程之間是有物理隔離: 不能共享內(nèi)存的數(shù)據(jù).(lock,隊(duì)列)
4.join阻塞:  讓主進(jìn)程等待子進(jìn)程結(jié)束之后,在執(zhí)行.
5.其他屬性: terminate() is_alive() name,
6.守護(hù)進(jìn)程: 將子進(jìn)程設(shè)置成守護(hù)進(jìn)程,當(dāng)主進(jìn)程結(jié)束了,子進(jìn)程就馬上結(jié)束.
          
        

2.僵尸進(jìn)程和孤兒進(jìn)程

2.1僵尸進(jìn)程

          
            僵尸進(jìn)程:一個(gè)進(jìn)程使用fork創(chuàng)建子進(jìn)程,如果子進(jìn)程退出,而父進(jìn)程并沒(méi)有調(diào)用wait或waitpid獲取子進(jìn)程的狀態(tài)信息,那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中,這種進(jìn)程稱之為僵尸進(jìn)程.
#基于unix環(huán)境(linux,macOS)
    #主進(jìn)程需要等待子進(jìn)程結(jié)束之后,主進(jìn)程才結(jié)束
主進(jìn)程時(shí)刻監(jiān)測(cè)子進(jìn)程的運(yùn)行狀態(tài),當(dāng)子進(jìn)程結(jié)束之后,一段時(shí)間之內(nèi),將子進(jìn)程進(jìn)行回收.

#為什么主進(jìn)程不在子進(jìn)程結(jié)束后馬上對(duì)其回收呢?
# 1. 主進(jìn)程與子進(jìn)程是異步關(guān)系.主進(jìn)程無(wú)法馬上捕獲子進(jìn)程什么時(shí)候結(jié)束.
# 2. 如果子進(jìn)程結(jié)束之后馬上再內(nèi)存中釋放資源,主進(jìn)程就沒(méi)有辦法監(jiān)測(cè)子進(jìn)程的狀態(tài)了.
#unix針對(duì)于上面的問(wèn)題,提供了一個(gè)機(jī)制.
#所有的子進(jìn)程結(jié)束之后,立馬會(huì)釋放掉文件的操作鏈接,內(nèi)存的大部分?jǐn)?shù)據(jù),但是會(huì)保留一些內(nèi)容: 進(jìn)程號(hào),結(jié)束時(shí)間,運(yùn)行狀態(tài),等待主進(jìn)程監(jiān)測(cè),回收.
僵尸進(jìn)程: 所有的子進(jìn)程結(jié)束之后,在被主進(jìn)程回收之前,都會(huì)進(jìn)入僵尸進(jìn)程狀態(tài).
#僵尸進(jìn)程有無(wú)危害???
#如果父進(jìn)程不對(duì)僵尸進(jìn)程進(jìn)行回收(wait/waitpid),產(chǎn)生大量的僵尸進(jìn)程,這樣就會(huì)占用內(nèi)存,占用進(jìn)程pid號(hào).
          
        

2.2孤兒進(jìn)程

          
            #父進(jìn)程由于某種原因結(jié)束了,但是你的子進(jìn)程還在運(yùn)行中,這樣你的這些子進(jìn)程就成了孤兒進(jìn)程.你的父進(jìn)程如果結(jié)束了,你的所有的孤兒進(jìn)程就會(huì)被init進(jìn)程的回收,init就變成了你的父進(jìn)程,對(duì)你進(jìn)行回收.
          
        

2.3僵尸進(jìn)程如何解決?

          
            #父進(jìn)程產(chǎn)生了大量子進(jìn)程,但是不回收,這樣就會(huì)形成大量的僵尸進(jìn)程,解決方式就是直接殺死父進(jìn)程,將所有的僵尸進(jìn)程變成孤兒進(jìn)程進(jìn)程,由init進(jìn)行回收.
          
        

3.互斥鎖,鎖

3.1互斥鎖的應(yīng)用

          
            # 三個(gè)同事 同時(shí)用一個(gè)打印機(jī)打印內(nèi)容.
# 三個(gè)進(jìn)程模擬三個(gè)同事, 輸出平臺(tái)模擬打印機(jī).

# 版本一:
# from multiprocessing import Process
# import time
# import random
# import os
#
# def task1():
#     print(f'{os.getpid()}開(kāi)始打印了')
#     time.sleep(random.randint(1,3))
#     print(f'{os.getpid()}打印結(jié)束了')
#
# def task2():
#     print(f'{os.getpid()}開(kāi)始打印了')
#     time.sleep(random.randint(1,3))
#     print(f'{os.getpid()}打印結(jié)束了')
#
# def task3():
#     print(f'{os.getpid()}開(kāi)始打印了')
#     time.sleep(random.randint(1,3))
#     print(f'{os.getpid()}打印結(jié)束了')
#
# if __name__ == '__main__':
#
#     p1 = Process(target=task1)
#     p2 = Process(target=task2)
#     p3 = Process(target=task3)
#
#     p1.start()
#     p2.start()
#     p3.start()

# 現(xiàn)在是所有的進(jìn)程都并發(fā)的搶占打印機(jī),
# 并發(fā)是以效率優(yōu)先的,但是目前我們的需求: 順序優(yōu)先.
# 多個(gè)進(jìn)程共強(qiáng)一個(gè)資源時(shí), 要保證順序優(yōu)先: 串行,一個(gè)一個(gè)來(lái).


# 版本二:


# from multiprocessing import Process
# import time
# import random
# import os
#
# def task1(p):
#     print(f'{p}開(kāi)始打印了')
#     time.sleep(random.randint(1,3))
#     print(f'{p}打印結(jié)束了')
#
# def task2(p):
#     print(f'{p}開(kāi)始打印了')
#     time.sleep(random.randint(1,3))
#     print(f'{p}打印結(jié)束了')
#
# def task3(p):
#     print(f'{p}開(kāi)始打印了')
#     time.sleep(random.randint(1,3))
#     print(f'{p}打印結(jié)束了')
#
# if __name__ == '__main__':
#
#     p1 = Process(target=task1,args=('p1',))
#     p2 = Process(target=task2,args=('p2',))
#     p3 = Process(target=task3,args=('p3',))
#
#     p2.start()
#     p2.join()
#     p1.start()
#     p1.join()
#     p3.start()
#     p3.join()

# 我們利用join 解決串行的問(wèn)題,保證了順序優(yōu)先,但是這個(gè)誰(shuí)先誰(shuí)后是固定的.
# 這樣不合理. 你在爭(zhēng)搶同一個(gè)資源的時(shí)候,應(yīng)該是先到先得,保證公平.


# 版本3:

from multiprocessing import Process
from multiprocessing import Lock
import time
import random
import os

def task1(p,lock):
    '''
    一把鎖不能連續(xù)鎖兩次
    lock.acquire()
    lock.acquire()
    lock.release()
    lock.release()
    '''
    lock.acquire()
    print(f'{p}開(kāi)始打印了')
    time.sleep(random.randint(1,3))
    print(f'{p}打印結(jié)束了')
    lock.release()

def task2(p,lock):
    lock.acquire()
    print(f'{p}開(kāi)始打印了')
    time.sleep(random.randint(1,3))
    print(f'{p}打印結(jié)束了')
    lock.release()

def task3(p,lock):
    lock.acquire()
    print(f'{p}開(kāi)始打印了')
    time.sleep(random.randint(1,3))
    print(f'{p}打印結(jié)束了')
    lock.release()

if __name__ == '__main__':

    mutex = Lock()
    p1 = Process(target=task1,args=('p1',mutex))
    p2 = Process(target=task2,args=('p2',mutex))
    p3 = Process(target=task3,args=('p3',mutex))

    p2.start()
    p1.start()
    p3.start()
          
        

Python并發(fā)編程03/僵尸孤兒進(jìn)程,互斥鎖,進(jìn)程之間的通信_(tái)第1張圖片

3.2Lock與join的區(qū)別

          
            #共同點(diǎn): 都可以把并發(fā)變成串行, 保證了順序.
#不同點(diǎn): join人為設(shè)定順序,lock讓其爭(zhēng)搶順序,保證了公平性.
          
        

4.進(jìn)程之間的通信

進(jìn)程在內(nèi)存級(jí)別是隔離的

4.1基于文件通信 (搶票系統(tǒng))

          
            # 搶票系統(tǒng).
# 1. 先可以查票.查詢余票數(shù).  并發(fā)
# 2. 進(jìn)行購(gòu)買(mǎi),向服務(wù)端發(fā)送請(qǐng)求,服務(wù)端接收請(qǐng)求,在后端將票數(shù)-1,返回到前端. 串行.

# from multiprocessing import Process
# import json
# import time
# import os
# import random
#
#
# def search():
#     time.sleep(random.randint(1,3))  # 模擬網(wǎng)絡(luò)延遲(查詢環(huán)節(jié))
#     with open('ticket.json',encoding='utf-8') as f1:
#         dic = json.load(f1)
#         print(f'{os.getpid()} 查看了票數(shù),剩余{dic["count"]}')
#
#
# def paid():
#     with open('ticket.json', encoding='utf-8') as f1:
#         dic = json.load(f1)
#     if dic['count'] > 0:
#         dic['count'] -= 1
#         time.sleep(random.randint(1,3))  # 模擬網(wǎng)絡(luò)延遲(購(gòu)買(mǎi)環(huán)節(jié))
#         with open('ticket.json', encoding='utf-8',mode='w') as f1:
#             json.dump(dic,f1)
#         print(f'{os.getpid()} 購(gòu)買(mǎi)成功')
#
# def task():
#     search()
#     paid()
#
#
# if __name__ == '__main__':
#
#     for i in range(6):
#         p = Process(target=task)
#         p.start()

# 當(dāng)多個(gè)進(jìn)程共強(qiáng)一個(gè)數(shù)據(jù)時(shí),如果要保證數(shù)據(jù)的安全,必須要串行.
# 要想讓購(gòu)買(mǎi)環(huán)節(jié)進(jìn)行串行,我們必須要加鎖處理.

#
# from multiprocessing import Process
# from multiprocessing import Lock
# import json
# import time
# import os
# import random
#
#
# def search():
#     time.sleep(random.randint(1,3))  # 模擬網(wǎng)絡(luò)延遲(查詢環(huán)節(jié))
#     with open('ticket.json',encoding='utf-8') as f1:
#         dic = json.load(f1)
#         print(f'{os.getpid()} 查看了票數(shù),剩余{dic["count"]}')
#
#
# def paid():
#     with open('ticket.json', encoding='utf-8') as f1:
#
#         dic = json.load(f1)
#     if dic['count'] > 0:
#         dic['count'] -= 1
#         time.sleep(random.randint(1,3))  # 模擬網(wǎng)絡(luò)延遲(購(gòu)買(mǎi)環(huán)節(jié))
#         with open('ticket.json', encoding='utf-8',mode='w') as f1:
#             json.dump(dic,f1)
#         print(f'{os.getpid()} 購(gòu)買(mǎi)成功')
#
#
# def task(lock):
#     search()
#     lock.acquire()
#     paid()
#     lock.release()
#
# if __name__ == '__main__':
#     mutex = Lock()
#     for i in range(6):
#         p = Process(target=task,args=(mutex,))
#         p.start()


# 當(dāng)很多進(jìn)程搶一個(gè)資源(數(shù)據(jù))時(shí), 你要保證順序(數(shù)據(jù)的安全),一定要串行.
# 互斥鎖: 可以公平性的保證順序以及數(shù)據(jù)的安全.

# 基于文件的進(jìn)程之間的通信:
    # 效率低.
    # 自己加鎖麻煩而且很容易出現(xiàn)死鎖.

          
        

Python并發(fā)編程03/僵尸孤兒進(jìn)程,互斥鎖,進(jìn)程之間的通信_(tái)第2張圖片

4.2基于隊(duì)列通信

          
            隊(duì)列: 把隊(duì)列理解成一個(gè)容器,這個(gè)容器可以承載一些數(shù)據(jù),
隊(duì)列的特性: 先進(jìn)先出永遠(yuǎn)保持這個(gè)數(shù)據(jù). FIFO(first in first out).
# from multiprocessing import Queue
# q = Queue()
# def func():
#     print('in func')
# q.put(1)
# q.put('alex')
# q.put([1,2,3])
# q.put(func)
#
#
# print(q.get())
# print(q.get())
# print(q.get())
# f = q.get()
# f()


# from multiprocessing import Queue
# q = Queue(3)
#
# q.put(1)
# q.put('alex')
# q.put([1,2,3])
# # q.put(5555)  # 當(dāng)隊(duì)列滿了時(shí),在進(jìn)程put數(shù)據(jù)就會(huì)阻塞.
# # q.get()
#
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())  # 當(dāng)數(shù)據(jù)取完時(shí),在進(jìn)程get數(shù)據(jù)也會(huì)出現(xiàn)阻塞,直到某一個(gè)進(jìn)程put數(shù)據(jù).


# from multiprocessing import Queue
# q = Queue(3)  # maxsize
#
# q.put(1)
# q.put('alex')
# q.put([1,2,3])
# q.put(5555,block=False)
#
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get(timeout=3))  # 阻塞3秒,3秒之后還阻塞直接報(bào)錯(cuò).
# print(q.get(block=False))

# block=False 只要遇到阻塞就會(huì)報(bào)錯(cuò).
          
        

Python并發(fā)編程03/僵尸孤兒進(jìn)程,互斥鎖,進(jìn)程之間的通信_(tái)第3張圖片


更多文章、技術(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)論
主站蜘蛛池模板: 一区二区三区无码高清视频 | 亚洲欧美日韩专区 | 欧美精品亚洲精品日韩专区va | 九九热精品 | 中文字幕亚洲综合久久男男 | 日本在线有码 | 97在线视频免费观看费观看 | 久久99热久久精品23 | 天天操天天干天搞天天射 | 中文字字幕乱码视频 | 久久精品国产亚洲沈樵 | 97久久久久国产精品嫩草影院 | 6一10周岁毛片免费 6一10周岁毛片在线 | 久久国产在线观看 | 四虎国产精品成人永久免费影视 | 国产精品一区二区综合 | 国产成人精品视频一区 | 久久人人爽人人爽 | 国产精品久久久久久久久久日本 | 天天操一操| 四虎.com| 久久亚洲影院 | 99国产精品久久久久久久成人热 | 久久精品国产亚洲沈樵 | 国产91精品一区二区视色 | 久久久久青草线蕉亚洲麻豆 | 日本高清在线观看天码888 | 四虎国产精品永久地址49 | 精品亚洲成a人在线观看 | 涩涩一区| 国产91嫩草精品 | 中文字幕在线观看一区二区三区 | 欧美成人全部费免网站 | 日韩专区中文字幕 | 久久88色综合色鬼 | 一二三区| 久久国产国内精品对话对白 | 免费一级毛片在线播放不收费 | 免费亚洲视频在线观看 | 国产亚洲玖玖玖在线观看 | 免费看曰批女人爽的视频网址 |