python中的进程实战部分
如果想了解进程 可以先看一下这一篇 python中的进程-理论部分multiprocessing模块介绍
python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。 Process类的介绍
创建进程的类 : Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) 强调: 1. 需要使用关键字的方式来指定参数 2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
group参数未使用,值始终为None
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,"tiga",)
kwargs表示调用对象的字典,kwargs={"name":"tiga","age":18}
name为子进程的名称
方法介绍:
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
属性介绍: p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置 p.name:进程的名称 p.pid:进程的pid p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可) p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)Process类的使用
注意:在windows中Process()必须放到# if __name__ == "__main__":下 ince Windows has no fork, the multiprocessing module starts a new Python process and imports the calling module. If Process() gets called upon import, then this sets off an infinite succession of new processes (or until your machine runs out of resources). This is the reason for hiding calls to Process() inside if __name__ == "__main__" since statements inside this if-statement will not get called upon import. 由于Windows没有fork,多处理模块启动一个新的Python进程并导入调用模块。 如果在导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资源)。 这是隐藏对Process()内部调用的原,使用if __name__ == "__main __",这个if语句中的语句将不会在导入时被调用。
创建并开启子进程的两种方式
方法一:import time import random from multiprocessing import Process def piao(name): print("%s piaoing" %name) time.sleep(random.randrange(1,5)) print("%s piao end" %name) p1=Process(target=piao,args=("egon",)) #必须加,号 p2=Process(target=piao,args=("alex",)) p3=Process(target=piao,args=("wupeqi",)) p4=Process(target=piao,args=("yuanhao",)) p1.start() p2.start() p3.start() p4.start() print("主线程")
方法二:#开进程的方法二: import time import random from multiprocessing import Process class Piao(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print("%s piaoing" %self.name) time.sleep(random.randrange(1,5)) print("%s piao end" %self.name) p1=Piao("xm") p2=Piao("xs") p3=Piao("xj") p4=Piao("xh") p1.start() #start会自动调用run p2.start() p3.start() p4.start() print("主线程")Process对象的join方法
join:主进程等,等待子进程结束from multiprocessing import Process import time import random class Piao(Process): def __init__(self,name): self.name=name super().__init__() def run(self): print("%s is piaoing" %self.name) time.sleep(random.randrange(1,3)) print("%s is piao end" %self.name) p=Piao("tiga") p.start() p.join(0.0001) #等待p停止,等0.0001秒就不再等了 print("开始")
有了join,程序不就是串行了吗??? from multiprocessing import Process import time import random def piao(name): print("%s is piaoing" %name) time.sleep(random.randint(1,3)) print("%s is piao end" %name) p1=Process(target=piao,args=("xm",)) p2=Process(target=piao,args=("xh",)) p3=Process(target=piao,args=("xj",)) p4=Process(target=piao,args=("xw",)) p1.start() p2.start() p3.start() p4.start() #有的同学会有疑问:既然join是等待进程结束,那么我像下面这样写,进程不就又变成串行的了吗? #当然不是了,必须明确:p.join()是让谁等? #很明显p.join()是让主线程等待p的结束,卡住的是主线程而绝非进程p, #详细解析如下: #进程只要start就会在开始运行了,所以p1-p4.start()时,系统中已经有四个并发的进程了 #而我们p1.join()是在等p1结束,没错p1只要不结束主线程就会一直卡在原地,这也是问题的关键 #join是让主线程等,而p1-p4仍然是并发执行的,p1.join的时候,其余p2,p3,p4仍然在运行,等#p1.join结束,可能p2,p3,p4早已经结束了,这样p2.join,p3.join.p4.join直接通过检测,无需等待 # 所以4个join花费的总时间仍然是耗费时间最长的那个进程运行的时间 p1.join() 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()Process对象的其他方法或属性
terminate与is_alivefrom multiprocessing import Process import time import random class Piao(Process): def __init__(self,name): self.name=name super().__init__() def run(self): print("%s is piaoing" %self.name) time.sleep(random.randrange(1,5)) print("%s is piao end" %self.name) p1=Piao("xm") p1.start() p1.terminate()#关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活 print(p1.is_alive()) #结果为True print("开始") print(p1.is_alive()) #结果为False
name与pidfrom multiprocessing import Process import time import random class Piao(Process): def __init__(self,name): # self.name=name # super().__init__() #Process的__init__方法会执行self.name=Piao-1, # #所以加到这里,会覆盖我们的self.name=name #为我们开启的进程设置名字的做法 super().__init__() self.name=name def run(self): print("%s is piaoing" %self.name) time.sleep(random.randrange(1,3)) print("%s is piao end" %self.name) p=Piao("egon") p.start() print("开始") print(p.pid) #查看pid
免费好用的全平台编辑器,手把手教你做一个Markdown这门简洁的标记语言,让我们写文章有了更方便的途径。macOS上面好用又好看的Markdown编辑器百花齐放,但在Windows上,好用的Markdown编辑器真是少
欧洲央行行长加密货币毫无价值应受到监管据彭博社网站5月21日报道,欧洲央行行长克里斯蒂娜拉加德说,加密货币是空中楼阁,应该受到监管,以引导人们避免用毕生积蓄进行投机。报道称,拉加德对荷兰电视台说,她担心有些人不了解风险
荣耀70系列已经确定于5月30号发布了荣耀70系列已经确定将于5月30日正式发布了,在网上提前曝光了一组该机四款配色的渲染图,同时呢还有网友晒出了该机的实拍图,整体来说呢,荣耀麒麟标准版支行将提供亮黑,流光水晶,墨玉金
一加Nord2T欧洲发布搭载天玑1300处理器,支持80W快充IT之家5月22日消息,近日一加在欧洲正式推出了Nord2T新机,该机是去年中端产品Nord2的后续产品。与前代产品相比,一加Nord2T升级并不大,几乎所有配置和基本设计都得到了
TWS颠覆造型设计,earsopen骨聆骨传导蓝牙耳机骨传导耳机虽然近几年渐被消费者熟知,但骨传导概念依然属于小众圈。从原理上来说,骨传导耳机是将音源信号转换为机械振动,再通过耳机与人体骨骼接触面进行振动来传递声音。不少人认为挂耳式骨
满大街自动驾驶,为什么还要升级LCC?这几年全球汽车产业经历了颠覆性的风云变幻,你和我都有幸见证历史书写的过程。自从特斯拉用过硬的综合产品力营销和服务力超越大众丰田等汽车大厂,成为市值冠军之后,同时特斯拉也带货了不少启
山东人一图导航采样点!全省核酸检测地图上线日前,山东省大数据局联合百度地图腾讯地图推出的全省核酸采样机构电子地图功能上线,切实满足群众核酸检测愿检尽检需求。有哪些核酸检测点?最近的核酸检测点在哪找?几点能去做核酸?是开展核
(科技)以色列团队用植物蛋白支架3D打印培养肉新华社耶路撒冷4月18日电(记者王卓伦吕迎旭)以色列研究人员近期在国际期刊生物材料杂志上报告了可用于培养肉制造的富含植物蛋白的支架材料,新研究有望推进培养肉工业化规模生产。培养肉产
4企业数字化变革的路径是什么?先说答案客户体验提升,进而提升运营流程效率,再到商业模式优化。根据多年咨询服务经验,建议从某个相对独立的业务部门,单点实验局部推广,取得一定成效之后,进行扩展复制,进而再优化创新。
华为余承东5月汽车手机企业或将全面停产近日,华为常务董事消费者BGCEO智能汽车解决方案BUCEO余承东在个人微信朋友圈表示,如果上海不能复工复产,5月之后所有科技工业产业涉及上海供应链的,都会全面停产,尤其汽车产业!
新规实施超半年网络游戏仍存乱象专家解读哪些漏洞需要堵?央广网北京4月18日消息(记者王逸群)据中央广播电视总台中国之声新闻纵横报道,去年8月,国家新闻出版署发布通知,要求进一步严格管理,切实防止未成年人沉迷网络游戏。记者调查显示,我国