プロセス32間の通信

プロセス間通信(インターPorcess通信は、IPCと呼ばれる)、我々は最初のキューを理解する必要があり、それはFIFOです。from multiprocessing import Queue使用。

from multiprocessing import Queue
q = Queue(6)
for i in range(6):
    q.put(i)
    print('%d放入队列'%i)
print('********************************')
while True:
    print(q.get())

キューので、2つのサブプロセス間の通信を介し。

from multiprocessing import Queue,Process
def produce(q):
    q.put('hello')
def consume(q):
    print(q.get())
if __name__ == '__main__':
    q = Queue()
    p = Process(target=produce,args=(q,))
    p.start()
    p1 = Process(target=consume,args=(q,))
    p1.start()

生産者、消費者モデル

キューは、データはデータのみ要求処理キューすることができ、安全なプロセスです。

from multiprocessing import Queue,Process
import time,random
def producer(name,food,q):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = '%s生产了%s%s'%(name,food,i)
        print(f)
        q.put(f)

def consumer(q,name):
    while True:
        food = q.get()
        if food is None:
            print('获取到一个空')
            break
        print('%s消费了%s'%(name,food))
        time.sleep(random.randint(1,3))

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer,args=('张三','包子',q))
    p2 = Process(target=producer,args=('李四','胡辣汤',q))
    c1 = Process(target=consumer,args=(q,'王五'))
    c2 = Process(target=consumer,args=(q,'yan五'))
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    q.put(None)
    q.put(None)

JoinableQueue

from multiprocessing import JoinableQueue,Process
def producer(name,food,q):
    for i in range(10):
        time.sleep(random.randint(1,3))
        f = '%s生产了%s%s'%(name,food,i)
        print(f)
        q.put(f)
    q.join()    #JoinableQueue的join代表阻塞 感知一个队列中的数据全部被执行完毕。

def consumer(q,name):
    while True:
        food = q.get()
        print('%s消费了%s'%(name,food))
        time.sleep(random.randint(1,3))
        q.task_done()   #提交一个回值,对q中的值的个数减一。
if __name__ == '__main__':
    q = JoinableQueue()
    p1 = Process(target=producer,args=('张三','包子',q))
    p2 = Process(target=producer,args=('李四','胡辣汤',q))
    c1 = Process(target=consumer,args=(q,'王五'))
    c2 = Process(target=consumer,args=(q,'yan五'))
    p1.start()
    p2.start()
    c1.daemon = True    #设置为守护进程,主进程代码执行完毕之后,子进程自动结束。
    c2.daemon = True
    c1.start()
    c2.start()
    p1.join()
    p2.join()   #进程的join是感知一个进程的结束

消費者側には:

  • 各時間は、データ取得、即ちトークンを送信:q.task_done()、フラグデータが正常に処理されます。

生産者側:

  • キューに入れたデータ、およびデータ・プロデューサーすべきデータすべての生産データを終えたときに、生産の各join信号は、生産データを停止している、データが処理されたときにデータが消費されるのを待たなければならない、join障害物の終わりを。

  • すべてのタスクでの消費者は、消費します

  • プロデューサーjoinの知覚遮断するストップ

  • すべての生産プロセスを終了

  • プライマリプロセスのp.join終了

  • プライマリプロセスの終了コード

  • デーモン(コンシューマ・プロセス)終了

おすすめ

転載: blog.csdn.net/weixin_43265998/article/details/90523125
おすすめ