进程锁Queue队列

进程锁Queue队列

进程锁

from multiprocessing import Process,Lock
import os,time
def task(i,lock):
    lock.acquire()#上锁
    print('进程进来了序号为:%s id号为:%s'%(i,os.getpid()))
    print('进程出去了序号为:%s id号为:%s'%(i,os.getpid()))
    time.sleep(2)
    lock.release()#解锁

if __name__ == '__main__':
    lock=Lock()
    for i in range(5):
        p=Process(target=task,args=(i,loc	k))
        p.start()
        print('main id为:%s' % p.pid)
锁就是并发变成串行,牺牲效率提高安全性

进程间数据隔离

from multiprocessing import Process

x=666

def task():
    global x
    x=999
    print('task:',x)

if __name__ == '__main__':
    # task()#调用方法
    # print('main:',x)#x被改变了为999 当前在一个进程
    p=Process(target=task)#实例化一个新进程
    p.start()#启动一个新进程
    print('main:', x)#main进程和p进程是两个不搭边的进程

Queue队列

from multiprocessing import Queue

if __name__ == '__main__':
    q=Queue(2) #一个空队列对象 ,只能放进去两个数据,如果有三个数据要放进去,两个先放进去,第三个等着,什么时候放进去的那两个被取走一个,他才会放进去
    q.put('我的天哪')
    q.put('我的地哪')
    # q.put('我的神哪',block=False)#放不进去数据立即报错  queue.Full
    # q.put('我的神哪',timeout=2) #数据放不进去等两秒,如果还放不进去 报错queue.Full
    # q.put_nowait('我的肾哪')#相当于加一个block 如果放不进去立即报错

    # print(q.get()) #取过值 队列就不存在这个值了
    # print(q.get()) #取过值 队列就不存在这个值了
    # print(q.get(block=False))#获取不到数据立即报错  _queue.Empty
    # print(q.get(timeout=2))#等两秒获取不到数据立即报错 _queue.Empty
    # print(q.get_nowait())#相当于加一个block 如果查不到立即报错
    # print(q.qsize())#返回队列的数量,返回队列目前有几个数据,如果上面get取过就会相应减少 不可靠的因为会很多进程操作可能
    # print(q.empty())#判断队列是不是空 空是True   有数据是False,如果上面get取过就会相应减少 不可靠的因为会很多进程操作可能
    # print(q.full())#判断队列满没满,满返回True,不满返回False 如果上面get取过就会相应减少 不可靠的因为会很多进程操作可能


    '''
        kafka(主流)
        rabbitmq(主流)
        httpsqs(不经常用)
        队列挤压,队列有很多数据取不出来,后面的越来越多,没人取数据
    '''

解决进程间数据隔离问题

from multiprocessing import Process,Queue

def task(queqe):#传进来个队列,往队列里添加数据
    queqe.put('handsome')
    
if __name__ == '__main__':
    q = Queue(2)
    p=Process(target=task,args=(q,))
    p.start()
    print(q.get())#从队列获取数据

生产者消费者模型代码演示******************************************************************

from multiprocessing import Process,Queue
import os,time
#版本1
# def producer(queue):
#     for i in range(10):
#         data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
#
#         queue.put(data)
#
#
# def consumer(queue):
#     while True:
#         time.sleep(1)
#         print(queue.get())
#
# if __name__ == '__main__':
#     q=Queue()
#     p=Process(target=producer,args=(q,))
#     p.start()
#
#     p1=Process(target=consumer,args=(q,))
#     p1.start()

#版本2
# def producer(queue):
#     for i in range(10):
#         data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
#
#         queue.put(data)
#     queue.put(None)
#
# def consumer(queue):
#     while True:
#
#         data=queue.get()
#         if not data : break
#         time.sleep(1)
#
#         print(data)
#
#
# if __name__ == '__main__':
#     q=Queue()
#     p=Process(target=producer,args=(q,))
#     p.start()
#
#     p1=Process(target=consumer,args=(q,))
#     p1.start()

#版本3
# def producer(queue):
#     for i in range(10):
#         data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
#         queue.put(data)
#     # queue.put(None)
#
# def consumer(queue):
#     while True:
#         data=queue.get()
#         if not data : break
#         time.sleep(1)
#
#         print(data)
#
#
# if __name__ == '__main__':
#     q=Queue()
#     p=Process(target=producer,args=(q,))
#     p.start()
#
#     p1=Process(target=consumer,args=(q,))
#     p1.start()
#
#     q.put(None)#q.put(None) 不能这么写 ,因为上面只是通知了操作系统启动进程,然后队列直接加进去一个None然后消费者取值时候第一个None退出
#     print('end>>>>>>')

#版本四
# def producer(queue):
#     for i in range(10):
#         data=('生产者%s 生产了第%s 个包子' %(os.getpid(),i))
#         queue.put(data)
#     # queue.put(None)
#
# def consumer(queue):
#     while True:
#         data=queue.get()
#         if not data : break
#         time.sleep(1)
#
#         print(data)
#
#
# if __name__ == '__main__':
#     q=Queue()
#     p=Process(target=producer,args=(q,))
#     p.start()
#
#     p1=Process(target=consumer,args=(q,))
#     p1.start()
#
#     p.join()
#     q.put(None)
#     # p1.join() #其实可以不用加
#     print('end>>>>>>')

# #版本5 多用户,生产者多,消费者少
# def producer(queue,food):
#     for i in range(10):
#         data=('生产者%s 生产了第%s个%s:' %(os.getpid(),i,food))
#         queue.put(data)
#
#
# def consumer(queue):
#     while True:
#         data=queue.get()
#         if not data : break
#         time.sleep(0.2)
#         print(data)
#
#
# if __name__ == '__main__':
#     q=Queue()
#     p1=Process(target=producer,args=(q,'鸡腿'))
#     p2=Process(target=producer,args=(q,'大辣条'))
#     p3=Process(target=producer,args=(q,'汉堡包'))
#     p1.start()
#     p2.start()
#     p3.start()
#
#     p4=Process(target=consumer,args=(q,))
#     p5=Process(target=consumer,args=(q,))
#     p4.start()
#     p5.start()
#
#     p1.join()
#     p2.join()
#     p3.join()
#     q.put(None)
#     q.put(None)
#     print('end>>>>>>')


#版本6 多用户,消费者多,生产者少
def producer(queue,food):
    for i in range(10):
        data=('生产者%s 生产了第%s个%s:' %(os.getpid(),i,food))
        queue.put('第%s个%s'%(i,food))


def consumer(queue,name):
    while True:
        try:
            data=queue.get(timeout=2)
            if not data : break
            time.sleep(0.2)
            print('消费者:%s消费了%s--'%(name,data))
        except Exception as e:
            print(e)
            break

if __name__ == '__main__':
    q=Queue()
    p1=Process(target=producer,args=(q,'鸡腿'))
    p2=Process(target=producer,args=(q,'大辣条'))
    p3=Process(target=producer,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,'贝吉塔'))
    p7=Process(target=consumer,args=(q,'特兰克斯'))
    p4.start()
    p5.start()
    p6.start()
    p7.start()
posted @ 2021-09-02 08:46  迪迦张  阅读(48)  评论(0编辑  收藏  举报