IPC 进程间通讯,排队输出--day33

"""
IPC 进程间通讯
由于进程之间内存是相互独立的 所以需要对应积极而方案 能够使得进程之间可以相互传递数据

1.使用共享文件,多个进程同时读写同一个文件
IO速度慢,传输数据大小不受限制

2.管道 是基于内存的,速度快,但是是单向的 用起来麻烦(了解)


3.申请共享内存空间,多个进程可以共享这个内存区域(重点)
速度快但是 数据量不能太大
"""

from multiprocessing import Process, Manager, Lock


def work(d):
d["count"] -= 1


if __name__ == '__main__':
with Manager() as m: # 申请一个共享的内存空间,命名为m
dic = m.dict({"count": 100}) # 把count = 100 共享
p_l = []
for i in range(100):
p = Process(target=work, args=(dic,))
p_l.append(p)
p.start()
for p in p_l:
p.join()
print(dic)


"""
----排队输出----
队列 不只用于进程间通讯
也是一种常见的数据容器

其特点是:先进先出
其优点是:可以保证数据不会错乱 即使在多进程下 因为其put和get默认都是阻塞的

对比堆栈刚好相反 :后进先出
put默认会阻塞 当容器中已经装满了
get默认会阻塞 当容器中已经没有数据了

"""
from multiprocessing import Queue

q = Queue(1) # 创建一个队列 最多可以存一个数据
q.put("张三")
print(q.get())
q.put("李四") # put默认会阻塞 当容器中已经装满了
print(q.get())
print(q.get()) # get默认会阻塞 当容器中已经没有数据了
print("over")


q = Queue(1) # 创建一个队列 最多可以存一个数据
q.put("张三")
# q.put("李四", False) # 第二个参数 设置为False表示不会阻塞 无论容器是满了 都会强行塞 如果满了就抛异常
print(q.get())
print(q.get(timeout=3)) # timeout 仅用于阻塞时,等待的时间

猜你喜欢

转载自www.cnblogs.com/wenchen/p/10196790.html