并发编程

时间:2019-10-22 15:50:25   收藏:0   阅读:114

并发编程

互斥锁 :

from multiprocessing import Process,Lock
import os , time

def wprk(lock):
    lock.acquire()  #枷锁
    print(f'{os.getpid} is running')
    time.sleep(2)
    print(f'{os.getpid} is done')
    lock.release()  #开锁
if __name__ == '__main__':
    lock =Lock()
    for i in range(3):
        P = Process(target = work,args=(lock,))
        p.start()

队列:

- 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 -创建队列的类(底层就是以管道和锁定的方式实现):

Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递
  1. q.put方法用以插入数据到队列中。

  2. q.get方法可以从队列读取并且删除一个元素

from multiprocessing import Process,Queue

q= Queue(3)
#put ,get ,put_nowait,get_nowait,full,empty
q.put(1)
q.put(2)
q.put(3)
print(q.full()) #满了
# q.put(4) #再放就阻塞住了
print(q.get())
print(q.get())
print(q.get())
print(q.empty()) #空了
# print(q.get()) #再取就阻塞住了

生产者与消费者:

- 生产者指的是生产数据的任务,消费者指的是处理数据的任务

from multiprocessing import  Process,JoinableQueue
import time,random,os
def consumer(q,name):
    while True:
        res = q.get()
        time.sleep(random.randint(1,3))
        print(f'\033[43m{name} 吃 {res}\033]')
        q.task_done()   # --发送给q.join()说明已经从队列中取走一个数据并处理完毕了
        
        
def producer(q,name,food):
    for i in range(3):
        time.sleep(random.randint(1,3))
        res = f'{food}{i}'
        q.put(res)
    
    q.join() #等到消费者把自己放入队列中的所有的数据都取走之后,生产者才结束
if __name__ == '__main__':
    q = JoinbleQueue()
     #生产者们:即厨师们
    p1=Process(target=producer,args=(q,'egon1','包子'))
    p2=Process(target=producer,args=(q,'egon2','骨头'))
    p3=Process(target=producer,args=(q,'egon3','泔水'))
    #消费者们:即吃货们
    c1=Process(target=consumer,args=(q,'alex1'))
    c2=Process(target=consumer,args=(q,'alex2'))
    c1.daemon=True
    c2.daemon=True
    #开始
    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    p3.join()
    #1、主进程等生产者p1、p2、p3结束
    #2、而p1、p2、p3是在消费者把所有数据都取干净之后才会结束
    #3、所以一旦p1、p2、p3结束了,证明消费者也没必要存在了,应该随着主进程一块死掉,因而需要将生产者们设置成守护进程
    print('主')
    

原文:https://www.cnblogs.com/shaozheng/p/11719900.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!