'''
多进程
优点:可以利用多核,实现并行运算
缺点:1、开销太大; 2、通信困难
使用方式跟开多线程一样
'''
多进程
import multiprocessing
import time,os
def foo(name):
print('ok')
print('name',name)
print('parent process:',os.getppid()) # os.getppid()获取父进程号
print('process id:',os.getpid()) # os.getpid()获取子进程号
time.sleep(2)
if __name__ == '__main__': # 开子进程必须用这种方式
foo('main process')
p = multiprocessing.Process(target=foo,args=('egon',))
p.start()
print('ending')
开多进程补充
def foo():
time.sleep(2)
print("ok")
#print(x)
print("yuan") # 每开启一个进程,会将主进程加载一次,也就会打印一次
if __name__ == '__main__': # 进程从这里开始
p=Process(target=foo,) # 新的进程,打印一次‘yuan’
p.start()
p1 = Process(target=foo, )
p1.start()
x=123 # Linux系统,新进程会自带主进程变量,所以自进程也可以打印x值,Windows系统不会
p.join()
print("ending")
'''
进程间通讯
队列,管道,manager共享
'''
进程queue
import multiprocessing
def foo(q):
q.put([11,'hello',True])
if __name__ == '__main__':
q = multiprocessing.Queue() # 进程队列,主函数运行创建进程队列
p = multiprocessing.Process(target=foo,args=(q,))
p.start()
print(q.get())
进程管道
from multiprocessing import Pipe,Process
def foo(a):
a.send('hello world')
print(a.recv())
if __name__ == '__main__':
a,b = Pipe()
p = Process(target=foo,args=(a,))
p.start()
print(b.recv())
b.send('hi son')
manager数据共享
from multiprocessing import Process,Pipe,Manager
def foo(d,i):
d[i] = i**2
if __name__ == '__main__':
manager=Manager()
mdict = manager.dict({})
l = []
for i in range(5):
p = Process(target=foo,args=(mdict,i))
p.start()
l.append(p)
for i in l:
i.join()
print(mdict)
'''
进程池
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;
但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,就重用进程池中的进程
'''
from multiprocessing import Pool
import time
def foo(n):
print(n)
time.sleep(1)
if __name__ == '__main__':
pool_obj = Pool(5)
for i in range(100):
pool_obj.apply_async(func=foo,args=(i,))
pool_obj.close()
pool_obj.join()
print('ending')