并发编程 - 进程 - 1.开启子进程的两种方式/2.查看pid/3.Process对象的其他属性或方法/4.守护进程
1.开启子进程的两种方式:
# 方式1:
from multiprocessing import Process
import time def task(name):
print('%s is running'%(name))
time.sleep(2)
print('%s is done'%name) if __name__ == '__main__':
# p = Process(target=task,kwargs={'name':'子进程1'})
p = Process(target=task,args=('子进程1',))
p.start() # 仅仅只是给os发了一个信号 print('主')
'''
主
子进程1 is running
子进程1 is done
''' # 方式二:
from multiprocessing import Process
import time class MyProcess(Process):
def __init__(self,name):
super().__init__()
self.name = name def run(self): # 只能叫run
print('%s is running'%(self.name))
time.sleep(2)
print('%s is done'%self.name) if __name__ == '__main__':
p = MyProcess('子进程1')
p.start() print('主') '''
主
子进程1 is running
子进程1 is done
'''
2.查看pid:
from multiprocessing import Process
import time
import os def task(name):
print('%s is running'%(name),os.getpid(),'parent:',os.getppid())
time.sleep(2)
print('%s is done'%name,os.getpid(),'parent:',os.getppid()) if __name__ == '__main__':
# p = Process(target=task,kwargs={'name':'子进程1'})
p = Process(target=task,args=('子进程1',))
p.start() # 仅仅只是给os发了一个信号 print('主',os.getpid(),'parent:',os.getppid()) '''
主 53400 parent: 12480 # pycharm的pid
子进程1 is running 51432 parent: 53400
子进程1 is done 51432 parent: 53400
'''
'''
cmd:
tasklist | findstr pycharm
pycharm64.exe 12480 Console 1 776,848 K
'''
'''
linux:
ps aux | grep pycharm
bj 30819 0.0 0.0 21312 976 pts/1 R+ 12:57 0:00 grep --color=auto pycharm
''' '''
僵尸进程与孤儿进程:
如果父进程一直不死,子进程变成了僵尸进程后一直占着pid ,有害!
父进程死之前,要wait()...回收僵尸进程的pid
孤儿进程,父进程先死了,linux中最大的父进程init进程会回收孤儿进程的pid
孤儿进程无害!最后init进程会回收!
如果父进程不死,僵尸进程有害,一直占着pid '''
3.Process对象的其他属性或方法:
# 1个子进程 join 方法:
from multiprocessing import Process
import time
import os def task(name):
print('%s is running'%(name),os.getpid(),'parent:',os.getppid())
time.sleep(2)
print('%s is done'%name,os.getpid(),'parent:',os.getppid()) if __name__ == '__main__':
p = Process(target=task,args=('子进程1',))
p.start() # 仅仅只是给os发了一个信号 p.join() # 主进程等待子进程的运行完成
print('主',os.getpid(),'parent:',os.getppid())
print(p.pid) # 子进程结束了,但是变成了僵尸进程,子进程的pid 还存在
"""
子进程1 is running 43680 parent: 46512
子进程1 is done 43680 parent: 46512
主 46512 parent: 12480
43680
"""
"""
主进程结束了,基于它的子进程才会结束,即僵尸进程的pid才会被回收!
""" # 多个子进程join方法 并行
from multiprocessing import Process
import time
import os def task(name,n):
print('%s is running'%(name))
time.sleep(n) if __name__ == '__main__':
start = time.time()
p1 = Process(target=task,args=('子进程1',5))
p2 = Process(target=task,args=('子进程2',3))
p3 = Process(target=task,args=('子进程3',2))
p_l = [p1,p2,p3]
# p1.start() # 仅仅只是给os发了一个信号
# p2.start()
# p3.start()
for p in p_l:
p.start() # p1.join() # 主进程在等... 等的是最长的那个时间 5 3 2
# p2.join() # 这里任然是并发
# p3.join()
for p in p_l:
p.join() print('主',(time.time()-start))
'''
主 34504 parent: 12480
子进程1 is running 51732 parent: 34504
子进程3 is running 48864 parent: 34504
子进程2 is running 16240 parent: 34504
'''
'''
子进程3 is running 46212 parent: 35732
子进程1 is running 1528 parent: 35732
子进程2 is running 50244 parent: 35732
主 35732 parent: 12480
'''
"""
子进程1 is running
子进程2 is running
子进程3 is running
主 5.094129323959351 # 等的是5秒 任然是并发,不是串行。
""" # 多个子进程join方法 串行
from multiprocessing import Process
import time
import os def task(name,n):
print('%s is running'%(name))
time.sleep(n) if __name__ == '__main__':
start = time.time()
p1 = Process(target=task,args=('子进程1',5))
p2 = Process(target=task,args=('子进程2',3))
p3 = Process(target=task,args=('子进程3',2)) p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join() print('主',(time.time()-start)) # 这个时候就是 串行
"""
子进程1 is running
子进程2 is running
子进程3 is running
主 10.235251665115356
""" # 其他方法:is_alive() terminate() pid name
from multiprocessing import Process
import time
import os def task(name):
print('%s is running'%(name),os.getpid())
time.sleep(2) if __name__ == '__main__':
# p = Process(target=task,args=('子进程1',))
# p.start()
# print(p.is_alive())
# p.join()
# print('主')
# print(p.pid) # 子进程即僵尸进程pid
# print(p.is_alive()) # 查看进程是否还活着 p = Process(target=task,name='sub-process',args=('子进程1',))
p.start()
# p.terminate() # 给os 发了个信号,还没来的及杀死子进程
# time.sleep(2)
# print(p.is_alive()) # True --> 加了time.sleep(2) --> False
print('主') print(p.name,p.pid)
"""
主
Process-1 48456
子进程1 is running 48456
"""
"""
主
sub-process 43556
子进程1 is running 43556
"""
4.守护进程
"""
开进程的目的:并发任务;假设任务在主进程死后没意义存在了,就设为守护进程。
守护进程:
0.p.daemon = True
1.主进程结束时,守护进程就完了
2.守护进程一定要在子进程start()前设置
3.不允许在守护进程内在开子进程
"""
from multiprocessing import Process
import time def task(name):
print('%s is running'%name)
time.sleep(2)
# p = Process(target=time.sleep,args=(3,))
# p.start() if __name__ == "__main__":
p = Process(target=task,args=('子进程1',))
p.daemon = True # 守护进程 主结束时,子进程就完了 ,守护进程一定要在子进程start() 前设置
p.start()
p.join()
print('主')
"""
主
"""
"""
子进程1 is running
主
""" """练习题:"""
# 思考下列代码的执行结果有可能有哪些情况?为什么?
from multiprocessing import Process
import time def foo():
print(123)
time.sleep(1)
print("end123") def bar():
print(456)
time.sleep(3)
print("end456") if __name__ == '__main__':
p1=Process(target=foo)
p2=Process(target=bar) p1.daemon=True # 主进程死后,代码执行完毕,守护进程就死了
p1.start()
p2.start()
print("main-------") # 只要这里一运行,守护进程就完了 """
main-------
456
end456
"""
并发编程 - 进程 - 1.开启子进程的两种方式/2.查看pid/3.Process对象的其他属性或方法/4.守护进程的更多相关文章
- 并发编程 - 线程 - 1.开启线程的两种方式/2.进程与线程的区别/3.Thread对象的其他属性或方法/4.守护线程
1.开启线程的两种方式: 进程,线程: 进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合)而线程才是cpu上的执行单位) 1.同一个进程内的多个线程共享该进程内的地址资源 2.创建线 ...
- python 之 并发编程(开启子进程的两种方式,进程对象的属性)
第九章并发编程 同一个程序执行多次是多个进程 import time import os print('爹是:',os.getppid()) #父进程PID,(pycharm) print('me ...
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Process 开启子进程 的两种方式、join控制子进程、守护进程
一.join控制子进程的一种方式 当主进程需要在子进程结束之后结束时,我们需要用到join来控制子进程. import time import random from multiprocessing ...
- python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)
9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...
- python 并发编程 多线程 开启线程的两种方式
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 二 开启线程的两种方式 第一种 每造一个进程,默认有一个线程,就是 ...
- 并发编程---Process对象的其他属性或方法
Process对象的其他属性或方法 #join方法 from multiprocessing import Process import time,os ''' 需求:让主进程等着子进程运行完毕,才能 ...
- Python 35 线程(1)线程理论、开启线程的两种方式
一:线程理论 1 什么是线程 进程其实一个资源单位,而进程内的线程才是cpu上的执行单位 线程其实指的就是代码的执行过程2 为何要用线程 线程vs进程 1. 同一进程下的多个线程共享该进程 ...
随机推荐
- codeblocks 配置OpenGL
一.选择编译器环境 这里选择codeblocks,带MinGW的版本. 二.下载glut工具包 网址:http://pan.baidu.com/s/1eQriTQM 三.配置glut 解压缩下载的gl ...
- hdu 5384 Danganronpa(字典树)
题意: f(A,B)表示:B在A中作为子串出现的次数. 题目给出n个证据,m个子弹 Ai是证据.Bi是子弹.题目问:全部Bi对每一个Ai造成的伤害是多少,即每一个Bi在Ai中出现的次数总和. 解析: ...
- jQuery——实现弹窗
window.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- udp program
UDP program UDP常用函数:recvfrom和sendto recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int ...
- 1.phpmyadmin的配置
一.解压后得到一个目录,进入相关目录中的\libraries目录,找到 config.default.php文件copy份到上级目录,并命名为config.inc.php ; 二.修改confing. ...
- 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?
早期,我们使用 Debian 作为服务器软件,后来转向了CentOS,主要原因如下: 1.CentOS/RHEL的生命周期是7年,基本上可以覆盖硬件的生命周期,也就意味着一个新硬件安装以后,不用再次安 ...
- Web app root system property already set to different value 错误原因及解决
http://yzxqml.iteye.com/blog/1761540 ——————————————————————————————————————————————————————————————— ...
- 数论 - SGU 107 987654321 problem
987654321 problem Problem's Link Mean: 略 analyse: 这道题目是道简单题. 不过的确要好好想一下: 通过简单的搜索可以知道,在N<9时答案一定为0, ...
- CSS3实现0.5px的边框
前端页面细节处理好了才会显得精致.边框在网页中是常见的一种样式了.虽然不把它处理为0.5px看上去没毛病,但是想让你做的东西征服更多的人,这些细节处理是必须的. 今天主要说一下如何让边框显示0.5px ...
- Angular入门篇高速开发导航网
简单介绍 AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式.这样的方式能够让你扩展HTML的语法.以弥补在构建动态WEB应用时静态文本的不足.从而在web应用程 ...