美文网首页
python多进程

python多进程

作者: 卡拉肖克_潘 | 来源:发表于2020-07-25 18:14 被阅读0次

参考: 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('============》')

相关文章

网友评论

      本文标题:python多进程

      本文链接:https://www.haomeiwen.com/subject/argplktx.html