多进程
- 多个进程间无任何共享状态
- 进程间有时需要交换数据,进程间通讯(InterprocessCommunication, IPC)
创建进程
- 直接生成Process实例
- 派生子类生成实例
- init函数:和threading一样,只要写此函数就要调用父类的init函数
- run函数:实际执行函数
import time
import multiprocessing
class MulProcess(multiprocessing.Process):
def __init__(self,arg):
super().__init__()
self.arg = arg
def run(self):
while True:
print(time.ctime())
time.sleep(self.arg)
if __name__ == "__main__":
p = MulProcess(2)
p.start()
查询当前进程和父进程id的函数
- os.ppid() 查询父进程ID
- os.pid() 查询本进程ID
JoinableQueue 多进程队列
- JoinableQueue是multiprocessing的方法
- 生产者消费者模型
import time
import multiprocessing
def scz(l, q):
for i in l:
#放入产品
q.put(i)
print("放入产品:" , i , time.ctime())
def xfz(q):
while True:
print("消费产品:" , q.get() , time.ctime())
#发出信号通知任务完成
q.task_done()
if __name__ == "__main__":
#实例化进程队列
q = multiprocessing.JoinableQueue()
#实例化线程
p = multiprocessing.Process(target=xfz, args=(q,))
#守护进程,主进程结束,子进程也跟着结束
p.daemon = True
p.start()
l = [i for i in range(1,5)]
scz(l,q)
#等待队列中所有项都处理完成
q.join()
- 哨兵值
- 认为放入一个特殊值,当消费者取出哨兵值时,执行相应的操作
- 有几个进程就放入几个哨兵值
- 例:哨兵值为None 当消费者取出值时判断,如果是哨兵值就跳出循环结束
import time
import multiprocessing
def scz(l, q):
for i in l:
q.put(i)
print("放入产品:" , i , time.ctime())
def xfz(q):
while True:
a = q.get()
if a is None:
break
else:
print("消费产品:" , a , time.ctime())
if __name__ == "__main__":
q = multiprocessing.JoinableQueue()
p = multiprocessing.Process(target=xfz, args=(q,))
p.start()
p1 = multiprocessing.Process(target=xfz, args=(q,))
p1.start()
l = [i for i in range(1,5)]
scz(l,q)
q.put(None)
q1.put(None)
q.join()
q.join()