参考: python并发编程之多进程(实践篇)
python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了multiprocessing。
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
创建并开启进程
#方法一 直接调用
import time
import multiprocessing
multiprocessing.set_start_method('spawn',True)
p1=multiprocessing.Process(target=getServerImages,args=(imagePath1,))
p2=multiprocessing.Process(target=getServerImages,args=(imagePath2,))
p3=multiprocessing.Process(target=getServerImages,args=(imagePath3,))
#进程守护,1)守护进程会在主进程代码执行结束后就终止;2)守护进程内无法再开启子进程,否则抛出异常;3)守护进程必须放在start()前。
p1.daemon=True
p2.daemon=True
p3.daemon=True
p1.start()
p2.start()
p3.start()
while True:
for p in multiprocessing.active_children():
print('childProcess:'+p.name+'\t,id:'+str(p.pid)+'is alive')
time.sleep(2)
#方法二 继承式调用
import time
import random
from multiprocessing import Process
class Run(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s runing' %self.name)
time.sleep(random.randrange(1,5))
print('%s runing end' %self.name)
p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
print('主线程')
Process对象的join方法
import time
import random
from multiprocessing import Process
class Run(Process):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
print('%s runing' %self.name)
time.sleep(random.randrange(1,5))
print('%s runing end' %self.name)
p1=Run('anne')
p2=Run('alex')
p3=Run('ab')
p4=Run('hey')
p1.start() #start会自动调用run
p2.start()
p3.start()
p4.start()
p1.join() #等待p1进程停止
p2.join()
p3.join()
p4.join()
print('主线程')
#注意上面的代码是主进程等待子进程,等待的是主进程,所以等待的总时间是子进程中耗费时间最长的那个进程运行的时间
#上述启动进程与join进程可以简写为
# p_l=[p1,p2,p3,p4]
#
# for p in p_l:
# p.start()
#
# for p in p_l:
# p.join()
信号量同步
基于内部计数器,每调用一次acquire(),计数器减1;每调用一次release(),计数器加1.当计数器为0时,acquire()调用被阻塞。
from multiprocessing import Process,Semaphore
import time,random
def go_wc(sem,user):
sem.acquire()
print('%s 占到一个茅坑' %user)
time.sleep(random.randint(0,3)) #模拟每个人拉屎速度不一样,0代表有的人蹲下就起来了
sem.release()
if __name__ == '__main__':
sem=Semaphore(3)
p_l=[]
for i in range(10):
p=Process(target=go_wc,args=(sem,'user%s' %i,))
p.start()
p_l.append(p)
for i in p_l:
i.join()
print('============》')
网友评论