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

Python并發(fā)編程之進(jìn)程通信

系統(tǒng) 1522 0
          
            
'''
進(jìn)程間的通信
'''

"""
multiprocessing模塊支持進(jìn)程間通信的兩種主要形式:管道和隊(duì)列
都是基于消息傳遞實(shí)現(xiàn)的,
"""
from multiprocessing import Queue
q = Queue(3)

#put, get, put_nowait, get_nowait, full, empty
q.put(1)
q.put(2)
q.put(3)
# q.put(1)#隊(duì)列已經(jīng)滿(mǎn)了,再加程序就會(huì)一直停在這里,等待數(shù)據(jù)被別人取走,不取走就一直停在這
## q.get(1)#可以先取出一個(gè),然后再加就可以了
## q.put(1)
# try:
#     q.put_nowait(1) #使用這個(gè)綁定方法,隊(duì)列滿(mǎn)了不會(huì)阻塞,但是會(huì)因?yàn)殛?duì)列滿(mǎn)了而報(bào)錯(cuò)。
# except:
#     print('隊(duì)列已經(jīng)滿(mǎn)了') #加了try之后,不阻塞,但是消息會(huì)丟
print(q.full())#查看隊(duì)列是否滿(mǎn)了
print(q.get())
print(q.get())
print(q.get())

# q.get(1)#同put 方法一樣,隊(duì)列空了繼續(xù)取就會(huì)出現(xiàn)阻塞。

#和上面方法類(lèi)似
try:
    q.get_nowait()
except:
    print('隊(duì)列已經(jīng)空了')

print(q.empty())

# 子進(jìn)程數(shù)據(jù)給父進(jìn)程
import time
from multiprocessing import Process, Queue

def  f(q):
    q.put([time.asctime(), 'from Eva', 'hello'])

if __name__ == '__main__':
    q = Queue() #創(chuàng)建一個(gè)Queue對(duì)象
    p = Process(target=f, args=(q, )) #創(chuàng)建一個(gè)進(jìn)程
    p.start()
    print(q.get())
    p.join()


#
# #批量生產(chǎn)數(shù)據(jù)放入隊(duì)列再批量獲取結(jié)果
import os
import time
import multiprocessing

#向queue中輸入數(shù)據(jù)的函數(shù)
def inputQ(queue):
    info = str(os.getpid()) + '(put): ' + str(time.asctime())
    queue.put(info)

#向queue中輸出數(shù)據(jù)的函數(shù)
def outputQ(queue):
    info = queue.get()
    print(f'{str(os.getpid())} (get): {info}')

#Main
if __name__ == '__main__':
    multiprocessing.freeze_support()
    record1 = [] #store input processes
    record2 = [] #store output processes
    queue = multiprocessing.Queue(3)

    #輸入進(jìn)程
    for i in range(10):
        process = multiprocessing.Process(target=inputQ, args=(queue, ))
        process.start()
        record1.append(process)

    #輸出進(jìn)程
    for i in range(10):
        process = multiprocessing.Process(target=outputQ, args = (queue, ))
        process.start()
        record2.append(process)

    for p in record1:
        p.join()

    for p in record2:
        p.join()


import os
import time
import multiprocessing

#向隊(duì)列中輸入數(shù)據(jù)
def inputQ(queue):
    info = str(os.getpid()) + '(put):' + str(time.asctime())
    queue.put(info)

#向隊(duì)列中輸出數(shù)據(jù)
def outputQ(queue):
    info = queue.get()
    print(f'{str(os.getpid())} (get: ) {info}')

if __name__ == '__main__':
    multiprocessing.freeze_support()
    p1_list = []
    p2_list = []
    q = multiprocessing.Queue(3)

    for i in range(10):
        p = multiprocessing.Process(target=inputQ, args=(q, ))
        p.start()
        p1_list.append(p)
    for i in range(10):
        p = multiprocessing.Process(target=outputQ, args=(q, ))
        p.start()
        p2_list.append(p)

    for k in p1_list:
        k.join()

    for j in p2_list:
        j.join()


#基于隊(duì)列實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模型(生產(chǎn)者生產(chǎn)出來(lái)放到阻塞隊(duì)列里,消費(fèi)者直接從阻塞隊(duì)列中取需要的東西)
from multiprocessing import Process, Queue #導(dǎo)入進(jìn)程和隊(duì)列模塊
import time, random,os#導(dǎo)入時(shí)間、隨機(jī)數(shù)和os模塊
def consume(q):#定義消費(fèi)者函數(shù)
    while True: #循環(huán)消費(fèi)
        res = q.get()  #從隊(duì)列中取東西
        time.sleep(random.randint(1, 3)) #隨機(jī)睡幾秒
        print(f'{str(os.getpid())} 吃 {res}') #打印出來(lái)
def producer(q): #定義生產(chǎn)者函數(shù)
    for i in range(10): #生產(chǎn)10個(gè)包子
        time.sleep(random.randint(1, 3)) #隨機(jī)睡幾秒
        res = f'包子{i}' #生產(chǎn)包子標(biāo)記下來(lái)
        q.put(res) #把包子放到阻塞隊(duì)列里面
        print(f'生產(chǎn)了{(lán)(os.getpid(), res)}') #打印東西
if __name__ == '__main__':
    q = Queue() #阻塞隊(duì)列
    #生產(chǎn)者們:即廚師們
    p1 = Process(target=producer, args=(q, ))

    #消費(fèi)者們:即吃貨們
    c1 = Process(target=consume, args=(q, ))

    #開(kāi)始
    p1.start()
    c1.start()
    print('主')



#生產(chǎn)者和消費(fèi)者(改良版)
'''
上面的版本主進(jìn)程永遠(yuǎn)不會(huì)結(jié)束,原因是:生產(chǎn)者p在生產(chǎn)完后就結(jié)束了,
但是消費(fèi)者c在取空了q之后,一直處于死循環(huán)卡在q.get這一步

解決方法是生產(chǎn)者生產(chǎn)完成之后,網(wǎng)隊(duì)列中組發(fā)一個(gè)結(jié)束信號(hào),這樣消費(fèi)者在接收到結(jié)束
信號(hào)后就可以break出死循環(huán)

注意:結(jié)束信號(hào)None,不一定要由生產(chǎn)者發(fā),主進(jìn)程里面同樣可以發(fā),但主進(jìn)程需要
等生產(chǎn)者結(jié)束后才應(yīng)該發(fā)送該信號(hào)
'''
import os, random, time
from multiprocessing import Process, Queue

#定義消費(fèi)者函數(shù)
def consume(queue):
    while True:
        res = queue.get()
        if res is None:break #收到結(jié)束信號(hào)則結(jié)束
        time.sleep(random.randint(1, 3))
        print(f'{str(os.getpid())} 吃了 {res}')

#定義生產(chǎn)者函數(shù)
def producer(queue):
    for i in range(10):
        time.sleep(random.randint(1, 3))
        res = f'包子{i}'
        queue.put(res)
        print(f'{os.getpid()}生產(chǎn)了{(lán)res}')
    # queue.put(None) #生產(chǎn)者發(fā)送結(jié)束信號(hào)

if __name__ == '__main__':
    q = Queue(3)

    #生產(chǎn)者
    p = Process(target=producer, args=(q, ))

    #消費(fèi)者
    q1 = Process(target=consume, args=(q, ))

    p.start()
    q1.start()

    p.join()
    q.put(None) #主進(jìn)程里面發(fā)送結(jié)束信號(hào)
    q1.join() #可加可不加

    print('主線(xiàn)程')

# 多個(gè)消費(fèi)者就需要發(fā)送多個(gè)None
from multiprocessing import Process,Queue
import time,random,os
def consumer(q):
    while True:
        res=q.get()
        if res is None:break #收到結(jié)束信號(hào)則結(jié)束
        time.sleep(random.randint(1,3))
        print('%s 吃 %s' %(os.getpid(),res))

def producer(name,q):
    for i in range(2):
        time.sleep(random.randint(1,3))
        res='%s%s' %(name,i)
        q.put(res)
        print('生產(chǎn)了 %s %s' %(os.getpid(),res))

if __name__ == '__main__':
    q=Queue()
    #生產(chǎn)者們:即廚師們
    p1=Process(target=producer,args=('包子',q))
    p2=Process(target=producer,args=('骨頭',q))
    p3=Process(target=producer,args=('泔水',q))

    #消費(fèi)者們:即吃貨們
    c1=Process(target=consumer,args=(q,))
    c2=Process(target=consumer,args=(q,))

    #開(kāi)始
    p1.start()
    p2.start()
    p3.start()
    c1.start()

    # 必須保證生產(chǎn)者全部生產(chǎn)完畢,才應(yīng)該發(fā)送結(jié)束信號(hào)
    p1.join()
    p2.join()
    p3.join()

    # 有幾個(gè)消費(fèi)者就應(yīng)該發(fā)送幾次結(jié)束信號(hào)None
    q.put(None)
    q.put(None) #發(fā)送結(jié)束信號(hào)
    print('主')


#JoinableQueue隊(duì)列實(shí)現(xiàn)消費(fèi)者與生產(chǎn)者模型
from multiprocessing import Process,JoinableQueue
import time,random,os
def consumer(q):
    while True:
        res=q.get()
        time.sleep(random.randint(1,3))
        print('%s 吃 %s' %(os.getpid(),res))
        #向q.join()發(fā)送一次信號(hào),證明一個(gè)數(shù)據(jù)已經(jīng)被取走了
        q.task_done()

def producer(name,q):
    for i in range(2):
        time.sleep(random.randint(1,3))
        res='%s%s' %(name,i)
        q.put(res)
        print('生產(chǎn)了 %s %s' %(os.getpid(),res))
    q.join() #生產(chǎn)完畢,使用此方法進(jìn)行阻塞,直到隊(duì)列中所有項(xiàng)目均被處理

if __name__ == '__main__':
    q=JoinableQueue()
    #生產(chǎn)者們:即廚師們
    p1=Process(target=producer,args=('包子',q))
    p2=Process(target=producer,args=('骨頭',q))
    p3=Process(target=producer,args=('泔水',q))

    #消費(fèi)者們:即吃貨們
    c1=Process(target=consumer,args=(q,))
    c2=Process(target=consumer,args=(q,))
    c1.daemon=True #設(shè)置成守護(hù)進(jìn)程
    c2.daemon=True #設(shè)置成守護(hù)進(jìn)程

    #開(kāi)始
    p_1 = [p1, p2, p3, c1, c2]
    for p in p_1:
        p.start()
    # 必須保證生產(chǎn)者全部生產(chǎn)完畢,才應(yīng)該發(fā)送結(jié)束信號(hào)
    p1.join()
    p2.join()
    p3.join()
    print('主')
'''
主進(jìn)程等--->p1, p2, p3等--->c1, c2
p1, p2, p3結(jié)束了,證明c1, c2肯定全部收完了p1, p2, p3發(fā)到隊(duì)列的數(shù)據(jù)
因而c1, c2也沒(méi)有存在的價(jià)值了,不需要繼續(xù)阻塞在進(jìn)程中影響主進(jìn)程了,
應(yīng)該隨著主進(jìn)程的結(jié)束而結(jié)束,所以設(shè)置成守護(hù)進(jìn)程就可以了
'''
          
        

更多文章、技術(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)論
主站蜘蛛池模板: 亚洲一区二区在线视频 | 国产玖玖在线 | 99精品在线免费 | 亚洲图片 中文字幕 | 午夜欧美性视频在线播放 | 日本最猛黑人xxxx猛交 | 一级片久久 | 美女做羞羞 | 99久久国产免费中文无字幕 | 夜夜躁狠狠躁日日躁视频 | 日日噜噜爽爽狠狠视频 | 精品一区二区三区中文 | 国产亚洲精品美女 | 起碰成人免费公开网视频 | 成人午夜性视频欧美成人 | 黄黄的网站在线观看 | 中文乱码在线观看 | 99热这里只有精品66 | 亚洲欧美成人综合久久久 | 老头老太做爰xxx视频 | 亚洲国产激情 | 内衣办公室动漫久久影院 | 日本不卡视频在线观看 | 国产美女精品在线 | 中文字幕欧美日韩va免费视频 | 国产91久久精品 | 亚洲激情网站 | 五月天色中色 | 国产综合欧美日韩视频一区 | 香蕉黄色网 | 色综合天天综合网亚洲 | 日本不卡在线 | 国产成人综合精品一区 | 国产精品久久久久尤物 | 亚洲人成网站色7799在线观看 | 欧美日韩一区二区视频免费看 | 成人看片黄a免费 | 男人猛躁女人成人免费视频 | 大伊香蕉精品视频在线天堂 | 午夜狠狠干 | 日本不卡二 |