进程Queue

进程间数据是隔离的

def task():
    global n
    n = 100
    print('子进程:', n)


if __name__ == '__main__':
    # p = Process(target=task, )
    # p.start()
    n = 10
    task()

    print('主进程:',n)

IPC进程间通信

Queue队列

先进先出
from  multiprocessing import  Queue

if __name__ == '__main__':

    q = Queue(3)  # 最多存放3个值
	q.put()  # 放入管道
    q.put('',block=False) # 存值满不闪烁等待,直接报错已存满
    q.put('',timeout=1)  # 存满值,等待1秒后,直接报错
    
    q.get()    # 取值
    q.qsize()  # 判断现在存了几个值在里面
    q.empty()  # 判断现在有没有存满

利用Queue解决进程间数据隔离

def task(queue):
    print('这个进程%s开始放数据了' % os.getpid())
    time.sleep(1)
    queue.put('min')
    print('这个进程%s数据发完了' % os.getpid())


if __name__ == '__main__':
    q = Queue(3)
    p = Process(target=task, args=(q,))
    p.start()

    print('主进程')
    res = q.get()
    print('主进程:', res)

多进程写入数据到Queue

def put_task(queue):
    queue.put('%s开始写数据了' % os.getpid())


def get_task(queue):
   print(('%s获得进程%s' % (os.getpid(),queue.get())))


if __name__ == '__main__':
    q = Queue(3)
    p = Process(target=put_task, args=(q,))
    p.start()

    p1 = Process(target=put_task, args=(q,))
    p1.start()

    p2 = Process(target=get_task, args=(q,))
    p2.start()

    p3 = Process(target=get_task, args=(q,))
    p3.start()

生产者消费模型代码

def produce(queue):
    for i in range(1, 6):
        date = ('进程%s ,制造了%s个包子' % (os.getpid(), i))
        print(date)

        time.sleep(2)
        queue.put('第%s个包子' % i)
# 	q.put(None)  或者放在for循环外面也可

def consumer(queue, ):
    while True:
        res = queue.get()
        if not res: break
        date = ('这个进程%s ,吃了%s ' % (os.getpid(), res))
        print(date)


if __name__ == '__main__':
    q = Queue(3)
    p = Process(target=produce, args=(q,))
    p.start()

    p1 = Process(target=consumer, args=(q,))
    p1.start()

    p.join()
#   q.put(None)   for循环也可,末尾要加join

多生产者,多消费者

def produce(queue, food):
    for i in range(1, 6):
        date = ('名字:%s ,制造了%s个%s' % (os.getpid(), i, food))
        print(date)

        time.sleep(2)
        queue.put('第%s个%s' % (i, food))


def consumer(queue, name):
    while True:
        try:
            res = queue.get(timeout=5)
            if not res: break
            date = ('消费者:%s ,吃了%s ' % (name, res))
            print(date)
        except Exception as e:
            print(e)
            break


if __name__ == '__main__':
    q = Queue(3)
    p1 = Process(target=produce, args=(q,'屎'))
    p2 = Process(target=produce, args=(q,'超尿'))
    p3 = Process(target=produce, args=(q,'敏屁'))
    p1.start()
    p2.start()
    p3.start()

    p4 = Process(target=consumer, args=(q,'敏敏'))
    p5 = Process(target=consumer, args=(q,'文豪'))
    p6 = Process(target=consumer, args=(q,'倩倩'))
    p4.start()
    p5.start()
    p6.start()

    p1.join()
    p2.join()
    p3.join()
    q.put(None)
    q.put(None)
posted @ 2021-07-31 13:08  wuc123  阅读(44)  评论(0)    收藏  举报