进程
创建
方法一:
from multiprocessing import Process
def go():
print("are you ok")
if __name__=="__main__":#不写会报错
p = Process(target=go)
p.start()
p.join()
方法二:
from multiprocessing import Process
class myprocess(Process):
def run(self):
print("are you ok")
if __name__=="__main__":
p = myprocess()
p.start()
p.join()#和线程的join类似
通信
1.进程间通信,Queue()队列,Pipe()管道
2.使用Manager()进行通信,支持共享列表、字典
from multiprocessing import Process,Manager
import time,os
def run(num,list):
time.sleep(4)
n=num
print("are you ok%d" % n)
list.append(n)
list.append(os.getpid())
if __name__=="__main__":
with Manager() as manager:
list=manager.list()#定义一个共享列表
#dict = manager.dict()#也可以定义一个共享的字典
p_list=[]
for i in range(5):
p=Process(target=run,args=(i*10,list))#初始化进程,将共享列表传入
p.start()
p_list.append(p)
for item in p_list:
p.join()#此方法必加,否则进程未执行完而退出导致报错
print(list)#打印共享列表,可见所以进程将数据存入列表中
结果:
are you ok10
are you ok20
are you ok30
are you ok0
are you ok40
[10, 282800, 20, 189824, 30, 282720, 0, 282676, 40, 283928]
Process finished with exit code 0
进程锁
进程也有锁Lock(),不过没什么卵用
进程池
进程开多了容易导致系统瘫痪,所以需要对开启的进程数量进行限制,所以我们需要定义一个进程池,池子大小(进程数)恒定,将进程放到池子内执行,防止系统瘫痪
from multiprocessing import Pool
import time
def run(num):
time.sleep(3)
print("are you ok%d"%num)
def end(arg):#定义回调函数时必须定义参数arg,否则会报错
print(arg)
print("all done")
if __name__=="__main__":
p = Pool(processes=3)#定义一个进程池,容量为3,即同一时刻最多只能有3个进程执行
for i in range(5):
#p.apply(run, args=(i,))#依次执行
p.apply_async(func=run,args=(i*10,),callback=end)#一次同时执行3个
p.close()
p.join()#必须在close()或terminal之后使用
结果:
are you ok0
None
all done
are you ok10
None
all done
are you ok20
None
all done
are you ok30
None
all done
are you ok40
None
all done
Process finished with exit code 0
线程和进程的总结
如果程序是属于 CPU 密集型,使用多进程。而多线程就更适合应用于 I/O 密集型程序。
还没有评论,来说两句吧
