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