python 之 并发编程(开启子进程的两种方式,进…
2019-07-24 09:25:43来源:博客园 阅读 ()
第九章并发编程
同一个程序执行多次是多个进程
import time import os ? print('爹是:',os.getppid()) #父进程PID,(pycharm) print('me是: ',os.getpid()) #3748 14648 time.sleep(500)
9.1 开启子进程的两种方式
服务端目标: 1、不间断地提供服务 2、服务端要支持高并发+高性能
一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
父进程发起请求,操作系统创建子进程
方式一:
from multiprocessing import Process import time import os def task(name): print('%s is running' %name) time.sleep(3) print('%s has done' %name) print('爹是:', os.getppid()) #me是: 13892 print('me是: ', os.getpid()) #me是: 7492 ? if __name__ == '__main__': # windows系统,开启子进程的操作一定要放到这下面 p=Process(target=task,args=('egon',)) # p=Process(target=task,kwargs={'name':'egon'}) p.start() # 向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态 print('me是: ', os.getpid()) #me是: 13892 print('======主')#======主 egon is running egon has done
-
target 表示调用对象,即子进程要执行的任务
-
args 指定为target函数传位置参数,是一个元组形式,必须有逗号
-
kwargs 表示调用对象的字典,kwargs={'name':'egon','age':18}
-
p.start() 启动进程,并调用该子进程中的p.run()
方式二:
from multiprocessing import Process import time ? class MyProcess(Process): def __init__(self,name): super(MyProcess,self).__init__() self.name=name ? def run(self): print('%s is running' %self.name) time.sleep(3) print('%s has done' %self.name) ? if __name__ == '__main__': p=MyProcess('egon') p.start() print('主') #主 egon is running egon has done
-
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
9.2 进程之间内存空间隔离
from multiprocessing import Process import time x=1000 def task(): time.sleep(3) global x x=0 print('儿子死啦',x) ? ? if __name__ == '__main__': print(x) p=Process(target=task) p.start() time.sleep(5) print(x) #1000 儿子死啦 0 1000
9.3 父进程等待子进程结束
from multiprocessing import Process import time x=1000 def task(): time.sleep(3) global x x=0 print('儿子死啦',x) ? if __name__ == '__main__': p=Process(target=task) p.start() ? p.join() # 让父亲在原地等 print(x) from multiprocessing import Process import time x=1000 def task(n): print('%s is runing' %n) time.sleep(n) ? if __name__ == '__main__': start_time=time.time() p_l=[] for i in range(1,4): p=Process(target=task,args=(i,)) p_l.append(p) p.start() ? for p in p_l: #1 is runing p.join() #3 is runing print('主',(time.time() - start_time)) #2 is runing 主 3.112313
9.4 进程对象的其他属性
-
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
-
p.is_alive():如果p仍然运行,返回True
-
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,强调: p.join只能 join住start开启的进程,而不能join住run开启的进程
-
p.pid:进程的pid
from multiprocessing import Process import time,os x=1000 def task(n): print('%s is runing self:%s parent:%s' %(n,os.getpid(),os.getppid()))#self:13032 parent:9136 time.sleep(3) ? if __name__ == '__main__': p1=Process(target=task,args=(1,),name='任务1')#不指定name,p1.name是process-1 p1.start() print(p1.pid) # 13032 没有p1.ppid print(p1.name) # 任务1 p1.terminate() # 向操作系统提交进程终止 p1.join() print(p1.is_alive()) # False ? print('主',os.getpid())# 主 9136
原文链接:https://www.cnblogs.com/mylu/p/11210157.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash