进程间数据是隔离的
def task():
global n
n = 100
print('子进程:', n)
if __name__ == '__main__':
# p = Process(target=task, )
# p.start()
n = 10
task()
print('主进程:',n)
IPC进程间通信
Queue队列
先进先出
from multiprocessing import Queue
if __name__ == '__main__':
q = Queue(3) # 最多存放3个值
q.put() # 放入管道
q.put('',block=False) # 存值满不闪烁等待,直接报错已存满
q.put('',timeout=1) # 存满值,等待1秒后,直接报错
q.get() # 取值
q.qsize() # 判断现在存了几个值在里面
q.empty() # 判断现在有没有存满
利用Queue解决进程间数据隔离
def task(queue):
print('这个进程%s开始放数据了' % os.getpid())
time.sleep(1)
queue.put('min')
print('这个进程%s数据发完了' % os.getpid())
if __name__ == '__main__':
q = Queue(3)
p = Process(target=task, args=(q,))
p.start()
print('主进程')
res = q.get()
print('主进程:', res)
多进程写入数据到Queue
def put_task(queue):
queue.put('%s开始写数据了' % os.getpid())
def get_task(queue):
print(('%s获得进程%s' % (os.getpid(),queue.get())))
if __name__ == '__main__':
q = Queue(3)
p = Process(target=put_task, args=(q,))
p.start()
p1 = Process(target=put_task, args=(q,))
p1.start()
p2 = Process(target=get_task, args=(q,))
p2.start()
p3 = Process(target=get_task, args=(q,))
p3.start()
生产者消费模型代码
def produce(queue):
for i in range(1, 6):
date = ('进程%s ,制造了%s个包子' % (os.getpid(), i))
print(date)
time.sleep(2)
queue.put('第%s个包子' % i)
# q.put(None) 或者放在for循环外面也可
def consumer(queue, ):
while True:
res = queue.get()
if not res: break
date = ('这个进程%s ,吃了%s ' % (os.getpid(), res))
print(date)
if __name__ == '__main__':
q = Queue(3)
p = Process(target=produce, args=(q,))
p.start()
p1 = Process(target=consumer, args=(q,))
p1.start()
p.join()
# q.put(None) for循环也可,末尾要加join
多生产者,多消费者
def produce(queue, food):
for i in range(1, 6):
date = ('名字:%s ,制造了%s个%s' % (os.getpid(), i, food))
print(date)
time.sleep(2)
queue.put('第%s个%s' % (i, food))
def consumer(queue, name):
while True:
try:
res = queue.get(timeout=5)
if not res: break
date = ('消费者:%s ,吃了%s ' % (name, res))
print(date)
except Exception as e:
print(e)
break
if __name__ == '__main__':
q = Queue(3)
p1 = Process(target=produce, args=(q,'屎'))
p2 = Process(target=produce, args=(q,'超尿'))
p3 = Process(target=produce, 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,'倩倩'))
p4.start()
p5.start()
p6.start()
p1.join()
p2.join()
p3.join()
q.put(None)
q.put(None)