多进程
2018-04-12 本文已影响0人
Freedom_pxc
多进程简单理解:
进程之间是独立的,是操作系统自己来维护和管理的,python通过C接口起了一个进程,多进程可以充分的利用多核CPU
- 多进程的创建:
"""
multiprocessing模块式python为开发多进程提供跨平台的模块模块式python为开发多进程提供跨平台的模块
"""
from multiprocessing import Process
#参数可有可无
def run(path,name):
#while True:
for i in range(100):
print("唱歌去",path,name)
if __name__ == "__main__":
print("程序开始运行....")
#target属性 指向执行的函数(传递),不是调用返回值
#创建独立的进程对象(可以开辟多个对象)
task1 = Process(target=run,args=("ktv","唱吧"))
#启动进程
task1.start()
task2 = Process(target=run,args=("去酒吧","sssss"))
task2.start()
print("程序运行结束")
多进程间的通信:
进程间独立,如果想相互访问,就必须有一个中间翻译,下面提供了几种进程间通信的方法
- 进程Queue
#import queue
from multiprocessing import Process,Queue
#子进程,内存独立,相当于数据的传递
def x(subQueue):
subQueue.put("呵呵")
if __name__ == "__main__":
#进程Queue
q = Queue()
#创建进程
p = Process(target=f,args=(q,))
#执行进程
p.start()
print(q.get())
"""
Queue通信,相当于父进程赋值了一个Queue给子进程,
子进程在这个Queue放好数据后,序列化一个中间翻译,
然后在反序列化返回给父进程,
因为进程之间内存独立,不能传递对象,传递的其实是序列化的数据
"""
- Pipe:
多进程有一种传递方式叫管道,它的原理和Queue相同
from multiprocessing import Process,Pipe
#定义子进程执行
def x(Subconn):
Subconn.send("成绩出来了吗")
print("这个是父亲的询问:",Subconn.recv())
Subconn.close()
if __name__ == "__main__":
#创建管道两端
parent_conn,child_conn = Pipe()
#创建子进程
p = Process(target = x.argst =(child_conn,))
p.start() #控制流程
print("l来自儿子的问候:",parent_conn.recv())
parent_conn.send("出来了,不怎么好")
p.join()
进程锁:
虽然内存独立,但是即使是打印也会造成打印数据错误,为了防止进程间抢屏幕打印输出,加了进程锁
from multiprocessing import Process,Lock
#定义子进程执行
def x (lock,num)
lock.acquire()
print("哈哈,嘻嘻,嘿嘿",num)
lock.release
if __name__ == "__main__":
lock = Lock()
#循环创建50个子进程
for num in range(50):
Process(target = x, args=(lock,num)).start()
进程池:
当我们需要的进程数量不多的时候,我们可以使用multiprocessing的Process类来创建进程。但是如果我们需要的进程特别多的时候,手动创建工作量太大了,所以Python也为我们提供了Pool(池)的方式来创建大量进程。
from multiprocessing import Pool
import os,time
def run(msg):
print("开始一个子线程运行了……")
time.sleep(1)
print("开始一个子线程运行结束了……")
if __name__ == "__main__":
pool = Pool(3) # 表示初始化一个进程池,最大进程数为3
for x in range(10):
pool.apply_async(run, args=("hello pool",))
print("------start----")
pool.close() # 关闭池
pool.join() # 等待所有的子进程完成,必须放在close后面
print("-------end------")