并發(fā)編程三曲横、自定義上下文管理

進(jìn)程調(diào)度
1、先來先服務(wù)
2不瓶、短作業(yè)優(yōu)先
3禾嫉、時(shí)間片輪轉(zhuǎn)
4、多級(jí)反饋隊(duì)列
僵尸進(jìn)程與孤兒進(jìn)程
1蚊丐、僵尸進(jìn)程:進(jìn)程結(jié)束了熙参,資源還沒來得及回收
2、孤兒進(jìn)程:主進(jìn)程掛了麦备,子進(jìn)程還沒結(jié)束孽椰,它就會(huì)被專門的進(jìn)程接管
進(jìn)程間數(shù)據(jù)隔離
進(jìn)程間的數(shù)據(jù)是獨(dú)有的昭娩,不同進(jìn)程間不能相互使用
進(jìn)程對(duì)象及其他方法

1、windows:tasklist | findstr   進(jìn)程id號(hào)

2黍匾、mac,linux:ps aux | grep  進(jìn)程id號(hào)

3栏渺、進(jìn)程對(duì)象:t = Process(target = task, )或者是在進(jìn)程內(nèi)部:current_process()

4、t.pid或者current_process().pid   獲得進(jìn)程id號(hào)

5膀捷、os.getpid()  同上迈嘹,獲取進(jìn)程id號(hào)

6、os.getppid()  獲取父進(jìn)程id號(hào)全庸,子進(jìn)程中獲取父進(jìn)程id秀仲,等于父進(jìn)程的id號(hào)

7、t.is_alive()或者current_process().is_alive()   查看進(jìn)程是否存活

8壶笼、t.terminate()   關(guān)閉進(jìn)程神僵,在主進(jìn)程關(guān)閉

pid、ppid的用法

from multiprocessing import Process,current_process
import os,time
def task():
    print('子進(jìn)程開始')
    print('在子進(jìn)程中查看自己的id:%s'%current_process().pid)
    print('在子進(jìn)程中查看自己的id:%s'%os.getpid())
    print('在子進(jìn)程中查看父進(jìn)程的id:%s'%os.getppid())
    time.sleep(1)
    print('子進(jìn)程結(jié)束')
if __name__ == '__main__':
    t = Process(target=task)
    t.start()
    print('在主進(jìn)程中查看子進(jìn)程的id:%s'%t.pid)
    print('在主進(jìn)程中查看自己的id:%s'%os.getpid())
    print('在主進(jìn)程中查看父進(jìn)程的id:%s'%os.getppid())
    # time.sleep(1)
    print('主進(jìn)程結(jié)束')
    #在主進(jìn)程中查看子進(jìn)程的id:8652
    #在主進(jìn)程中查看自己的id:14888
    #在主進(jìn)程中查看父進(jìn)程的id:4564
    #主進(jìn)程結(jié)束
    #子進(jìn)程開始
    #在子進(jìn)程中查看自己的id:8652
    #在子進(jìn)程中查看自己的id:8652
    #在子進(jìn)程中查看父進(jìn)程的id:14888
    #子進(jìn)程結(jié)束

name覆劈、is_alive保礼、terminate用法

from multiprocessing import Process,current_process
import os,time
def foo(n,tag):
    print(f'子進(jìn)程{tag} 開啟')
    print('當(dāng)前進(jìn)程的名字:%s'%current_process().name)
    time.sleep(n)
    print(f'子進(jìn)程{tag} 關(guān)閉')
if __name__ == '__main__':
    t1 = Process(target=foo,args=(3,1))
    t2 = Process(target=foo,args=(2,2))
    t1.start()
    t2.start()
    t1.terminate()    # 給操作系統(tǒng)發(fā)了一個(gè)終止進(jìn)程的請(qǐng)求
    time.sleep(0.0000069)
    print(t1.is_alive())   # 判斷進(jìn)程是否活著
    t2.join()
    print(t1.is_alive())
    print('子進(jìn)程的名字:%s'%t1.name)
    print('子進(jìn)程的名字:%s' %t2.name)
#False
#子進(jìn)程2 開啟
#當(dāng)前進(jìn)程的名字:Process-2
#子進(jìn)程2 關(guān)閉
#False
#子進(jìn)程的名字:Process-1
#子進(jìn)程的名字:Process-2

守護(hù)進(jìn)程

from multiprocessing import Process
import time,os

def task(n,tag):
    print('%s is running'%tag)
    time.sleep(n)
    print('%s is done'%tag)

if __name__ == '__main__':
    t = Process(target=task,args=(5,'子進(jìn)程'))
    t.daemon = True  #守護(hù)進(jìn)程:主進(jìn)程一旦結(jié)束,子進(jìn)程也結(jié)束责语,一定要加在啟動(dòng)之前
    t.start()
    time.sleep(2)
    print('主進(jìn)程結(jié)束')

互斥鎖
作用:---為了防止多進(jìn)程操作同一個(gè)數(shù)據(jù)(文件)炮障,數(shù)據(jù)寫亂了的問題。
---要在進(jìn)程寫數(shù)據(jù)的時(shí)候加鎖坤候,并行變成串行胁赢,犧牲了效率,保證了安全白筹。

from multiprocessing import Process, Lock
import json,time
def search():
    with open('ticket.json','r',encoding='utf-8') as f:
        dic = json.load(f)
        print(f'余票還有{dic.get("count")}')
        return dic
def buy():
    dic = search()
    time.sleep(1)  # 模擬網(wǎng)絡(luò)IO
    if dic.get('count') > 0:
        dic['count'] -= 1
        with open('ticket.json','w',encoding='utf-8') as f:
            json.dump(dic,f)
            time.sleep(1.5)  #模擬網(wǎng)絡(luò)IO
            print('購票成功')
    else:
        print('購票失敗')

def task(mutex):
    search()  #查看過程不加鎖智末,每個(gè)人都能查看
    # mutex.acquire()  # 買票過程要加鎖,買前加鎖
    # buy() # 10個(gè)進(jìn)程不能并發(fā)了徒河,只能串行執(zhí)行
    # mutex.release()  # 買后釋放鎖
    with mutex:
        buy()  # 這兩步相當(dāng)于上面的三步

if __name__ == '__main__':
    mutex = Lock()  # 在主進(jìn)程中創(chuàng)建鎖
    for i in range(10):  # 模擬十人買票(開10個(gè)進(jìn)程)
        t = Process(target=task,args=(mutex,))
        t.start()

隊(duì)列介紹
q = Queue(隊(duì)列大小)
q.put() 放值
q.put_nowait() 隊(duì)列滿了系馆,放不進(jìn)去就不放了,報(bào)錯(cuò)
q.get() 從隊(duì)列頭部取出一個(gè)值
q.get_nowait() 從隊(duì)列頭部取值顽照,沒有就報(bào)錯(cuò)
print(q.empty()) 查看隊(duì)列是不是空的
print(q.full()) 查看隊(duì)列是不是滿的

from multiprocessing import Queue
q = Queue(5)
q.put(1)
q.put(2)
q.put(3)
q.put('qe')
q.put_nowait(100)

print(q.get())
print(q.get())
print(q.get(timeout=100))
print(q.get_nowait())
print(q.empty())
print(q.full())

IPC機(jī)制(進(jìn)程間通信)

from multiprocessing import Process,Queue
import os,time
def task1(q):
    print('我是進(jìn)程1由蘑,id是%s'%os.getpid())
    q.put('nihao')
    q.put('111')
    q.put('222')
def task2(q):
    res = q.get()
    q.get()
    print(q.empty())  # 查看隊(duì)列是否為空
    print('我是進(jìn)程2,id是%s'%os.getpid(),res)
if __name__ == '__main__':
    q = Queue(5)
    t1 = Process(target=task1,args=(q,))
    t1.start()
    t2 = Process(target=task2,args=(q,))
    t2.start()
    print(q.get())

上下文管理器的使用
魔法方法:在進(jìn)行特定的操作時(shí)會(huì)自動(dòng)被調(diào)用(如:enter代兵、exit纵穿、init等)
用魔法方法實(shí)現(xiàn)上下文管理器讀模式

class MyClass():
    def __init__(self,file_name,mode,encoding):
        self.file_name = file_name
        self.mode = mode
        self.encoding = encoding
    def __enter__(self):
        #只要有with就會(huì)執(zhí)行
        self.file = open(self.file_name,self.mode,encoding=self.encoding)
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        #只要頂格寫代碼就會(huì)執(zhí)行
        self.file.close()
with MyClass('ticket.json','r',encoding='utf-8') as f:
    print(f.read())
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奢人,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淆院,老刑警劉巖何乎,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異支救,居然都是意外死亡抢野,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門各墨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來指孤,“玉大人,你說我怎么就攤上這事贬堵∈研” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵黎做,是天一觀的道長(zhǎng)叉跛。 經(jīng)常有香客問我,道長(zhǎng)蒸殿,這世上最難降的妖魔是什么筷厘? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宏所,結(jié)果婚禮上酥艳,老公的妹妹穿的比我還像新娘。我一直安慰自己爬骤,他們只是感情好充石,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盖腕,像睡著了一般赫冬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溃列,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天劲厌,我揣著相機(jī)與錄音,去河邊找鬼听隐。 笑死补鼻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雅任。 我是一名探鬼主播风范,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沪么!你這毒婦竟也來了硼婿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤禽车,失蹤者是張志新(化名)和其女友劉穎寇漫,沒想到半個(gè)月后刊殉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州胳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年记焊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栓撞。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遍膜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓤湘,到底是詐尸還是另有隱情瓢颅,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布岭粤,位于F島的核電站惜索,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剃浇。R本人自食惡果不足惜巾兆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虎囚。 院中可真熱鬧角塑,春花似錦、人聲如沸淘讥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲列。三九已至窒朋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝗岖,已是汗流浹背侥猩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抵赢,地道東北人欺劳。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铅鲤,于是被迫代替她去往敵國和親划提。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354