Python8期 Day33 2019/ 5/33

PID

系统会给每一个进程分配一个进程编号即PID,如同人需要一个身份证号来区分。

print(os.getpid())

PPID

# 在python中可以使用os模块来获取ppid
import os
print("self",os.getpid()) # 当前进程自己的pid
print("parent",os.getppid()) # 当前进程的父进程的pid

多进程

1.程序:一堆可以被计算机识别的文件

2.进程:是正在运行的程序

3.注意:一个程序可以被多次执行,产生多个进程,但各个进程是相互独立的

阻塞 非阻塞 并行 并发 (重点)

1.阻塞:指的是程序遇到IO操作,或者sleep导致后续的代码不能执行

2.非阻塞:与阻塞相反表示程序正常的执行

3.并行:表示多个任务真正的同时被执行,CPU必须具备多核

4.并发:多个任务看似在同时执行,实际上是切换执行速度非常快

三种状态的切换

 

 

进程的两种使用方式 (重点)

把当前程序中的耗时操作交給子进程来完成,如此当前应用程序可以继续执行其他任务!
方式1:

实例化Process类

from multiprocessing import Process
import time

def task(name):
   print('%s is running' %name)
   time.sleep(3)
   print('%s is done' %name)
if __name__ == '__main__':
   # 在windows系统之上,开启子进程的操作一定要放到这下面
   # Process(target=task,kwargs={'name':'egon'})
   p=Process(target=task,args=('jack',))
   p.start() # 向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态
   print('======主')
方式2:

继承Process类 并覆盖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 is done' %self.name)
if __name__ == '__main__':
   p=MyProcess('jack')
   p.start()
   print('主')

需要注意的是

1.在windows下 开启子进程必须放到__main__下面,因为windows在开启子进程时会重新加载所有的代码造成递归创建进程

2.第二种方式中,必须将要执行的代码放到run方法中,子进程只会执行run方法其他的一概不管

进程间内存相互隔离

from multiprocessing import Process
import time
name = "青椒"
def task():
global name
name = "rose"
print("改完了!")
print("子进程的%s" % name)


if __name__ == '__main__':
p = Process(target=task)
p.start()
time.sleep(2)
print(name)

#结果:
改完了!
子进程的rose
青椒

join函数

1.作用:用于提高子进程优先级 ,使得父进程等待子进程结束

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)

Process对象常用属性

from multiprocessing import Process
def task(n):
    print('%s is runing' %n)
    time.sleep(n)

if __name__ == '__main__':
    start_time=time.time()
    p1=Process(target=task,args=(1,),name='任务1')
    p1.start() # 启动进程
    print(p1.pid) # 获取进程pid
    print(p1.name) # 获取进程名字
    p1.terminate() # 终止进程
    p1.join() # 提高优先级
    print(p1.is_alive()) # 获取进程的存活状态

    print(p.exitcode) # 获取退出码
    print('主')

孤儿进程

指的是,父进程先结束 ,而子进程还在运行着,

孤儿进程无害,有 其存在的必要性

例如:qq开启了浏览器,qq先退出了 浏览器应该继续运行

孤儿进程会被操作系统接管

僵尸进程

值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程

僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程

linux 中有一个wai/waitpid 用于父进程回收子进程资源

python会自动回收僵尸进程

 

 

 

转载于:https://www.cnblogs.com/tfzz/p/10956992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值