标签:不能 模型 join() dom 共享内存 rgs gen 互斥锁 process
from multiprocessing import Process,Lock
import time,random
def task1(lock):
# 要开始使用了 上锁
lock.acquire() #就等同于一个if判断
print("hello iam jerry")
time.sleep(random.randint(0, 2))
print("gender is boy")
time.sleep(random.randint(0, 2))
print("age is 15")
# 用完了就解锁
lock.release()
def task2(lock):
lock.acquire()
print("hello iam owen")
time.sleep(random.randint(0,2))
print("gender is girl")
time.sleep(random.randint(0,2))
print("age is 48")
lock.release()
def task3(lock):
lock.acquire()
print("hello iam jason")
time.sleep(random.randint(0,2))
print("gender is women")
time.sleep(random.randint(0,2))
print("age is 26")
lock.release()
if __name__ == ‘__main__‘:
lock = Lock()
p1 = Process(target=task1,args=(lock,))
p2 = Process(target=task2,args=(lock,))
p3 = Process(target=task3,args=(lock,))
p1.start()
# p1.join()
p2.start()
# p2.join()
p3.start()
# p3.join()
# print("故事结束!")
# 锁的伪代码实现
# if my_lock == False:
# my_lock = True
# #被锁住的代码
my_lock = False 解锁
Manager所创建出来的数据结构,具备进程共享的特点, 需要强调的是 Manager创建的一些数据结构是不带锁的 可能会出现问题
from multiprocessing import Process,Manager,Lock
import time
def task(data,l):
l.acquire()
num = data["num"] #
time.sleep(0.1)
data["num"] = num - 1
l.release()
if __name__ == ‘__main__‘:
# 让Manager开启一个共享的字典
m = Manager()
data = m.dict({"num":10})
l = Lock()
for i in range(10):
p = Process(target=task,args=(data,l))
p.start()
time.sleep(2)
print(data)
1)什么是队列
队列是一种特殊的数据结构先存储的先取出,就像排队一样,先进先出
注:堆栈是先存储后取出,就像衣柜一样
from multiprocessing import Queue
# 创建队列 不指定maxsize 则没有数量限制
q = Queue(3)
# 存储元素
# q.put("abc")
# q.put("hhh")
# q.put("kkk")
# print(q.get())
# q.put("ooo") # 如果容量已经满了,在调用put时将进入阻塞状态 直到有人从队列中拿走数据有空位置 才会继续执行
#取出元素
# print(q.get())# 如果队列已经空了,在调用get时将进入阻塞状态 直到有人从存储了新的数据到队列中 才会继续
# print(q.get())
# print(q.get())
#block 表示是否阻塞 默认是阻塞的 # 当设置为False 并且队列为空时 抛出异常
q.get(block=True,timeout=2)
# block 表示是否阻塞 默认是阻塞的 # 当设置为False 并且队列满了时 抛出异常
# q.put("123",block=False,)
# timeout 表示阻塞的超时时间 ,超过时间还是没有值或还是没位置则抛出异常 仅在block为True有效
def eat(q):
for i in range(10):
# 要消费
rose = q.get()
time.sleep(random.randint(0, 2))
print(rose,"吃完了!")
# 生产任务
def make_rose(q):
for i in range(10):
# 再生产
time.sleep(random.randint(0, 2))
print("第%s盘青椒肉丝制作完成!" % i)
rose = "第%s盘青椒肉丝" % i
# 将生成完成的数据放入队列中
q.put(rose)
if __name__ == ‘__main__‘:
# 创建一个共享队列
q = Queue()
make_p = Process(target=make_rose,args=(q,))
eat_p = Process(target=eat,args=(q,))
make_p.start()
eat_p.start()
标签:不能 模型 join() dom 共享内存 rgs gen 互斥锁 process
原文地址:https://www.cnblogs.com/xzcvblogs/p/10969723.html