进程

python学习网 2018-04-24 20:14:13

知识储备

进程:

  进程就是一个正在执行的过程,或者说一个软件的运行过程

  进程是一个虚拟的概念

  进程的概念起源:操作系统



操作系统发展史

  批处理操作系统:(串行)

    把程序员的程序攒成一堆

    然后批处理系统读一道程序到内存然后执行

    执行完毕后输出,然后才能读入下一道程序

  多道技术:

    产生背景:在单核下实现并发

    两大核心点:

      1、空间的复用

        多道程序同时读入内存中。等到被 CPU执行,即产生了多个进程

        强调:进程之间的内存空间是互相隔离的,而且这种隔离栅物理级别

      2、时间的复用

        复用CPU的时间

        切:

          1、正在执行的进程遇到I/O操作(提升效率)

          2、正在执行的进程,占用时间过长,

          或优先级更高的进程抢走的CPU执行权限(降低效率)

  并发:本质是切换+保存状态

  并行

  串行:一个进程正在使用CPU,其他进程均在等待(区别于阻塞)

  阻塞:正在运行的进程,遇到I/O,被剥夺了CPU的使用权限

  非阻塞
知识储备

进程,操作系统(win,unix)里管理的单位:

win:父、子进程是各自不同的地址空间

unix:每开启一个子进程,子进程的初始数据,是主进程的一个副本

开启(申请)进程的两种方式:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2018/04/24 10:29
 4 # @Author  : MJay_Lee
 5 # @File    : 02开启进程.py
 6 # @Contact : limengjiejj@hotmail.com
 7 
 8 import time
 9 from multiprocessing import Process
10 
11 def task(name):
12     print('%s is running' % name)
13     time.sleep(3)
14     print('%s is done' % name)
15 
16 if __name__ == '__main__':
17     # 在windows系统上,开启子进程的操作一定要放到此步骤下面,unix则不用
18     # Process(target=task,kwargs={'name':'egon'}) 方式一 关键字赋值
19     p = Process(target=task,args=('egon',)) # 方式二,args传值是元组,勿忘逗号
20     p.start() # 想操作系统发送请求,操作系统会申请内存空进啊,然后把父进程的数据拷贝给子进程,作为子进程的初始状态
21     print('========主')
方式一
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2018/04/24 10:48
 4 # @Author  : MJay_Lee
 5 # @File    : 03开启进程方式二.py
 6 # @Contact : limengjiejj@hotmail.com
 7 
 8 import time
 9 from multiprocessing import Process
10 
11 class MyProcess(Process):
12     def __init__(self,name):
13         super(MyProcess,self).__init__()
14         self.name = name
15     def run(self):
16         print('%s is running' % self.name)
17         time.sleep(3)
18         print('%s is done' % self.name)
19 
20 if __name__ == '__main__':
21     p = MyProcess('lmj')
22     p.start()
23     print('====>主')
方式二

子进程等待父进程结束:

 1 import time
 2 from multiprocessing import Process
 3 
 4 def task(n):
 5     print('%s is running' % n)
 6     time.sleep(n)
 7 
 8 if __name__ == '__main__':
 9     p_list = []
10     for i in range(1,4):
11         p = Process(target=task,args=(i,))
12         p_list.append(p)
13         p.start()
14 
15     for p in p_list:
16         p.join()
17 
18     print('====>主')
19 
20 """
21 3 is running
22 2 is running
23 1 is running
24 ====>主
25 """
进程的join()方法

 子进程ppid方法的认识:

https://segmentfault.com/q/1010000014562902?_ea=3668830

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2018/04/24 12:02
 4 # @Author  : MJay_Lee
 5 # @File    : 05进程对象????.py
 6 # @Contact : limengjiejj@hotmail.com
 7 
 8 # import time,os
 9 # from multiprocessing import Process
10 #
11 # def task():
12 #     print('self:%s parent:%s' %(os.getpid(),os.getppid()))
13 #     time.sleep(3)
14 #
15 # if __name__ == '__main__':
16 #     p1 = Process(target=task,)
17 #     p1.start()
18 #
19 #     print(p1.pid)
20 #     # print(p1.ppid)
21 #     print('====>主',os.getpid())
22 
23 
24 import time,os
25 from multiprocessing import Process
26 
27 class Myprocess(Process):
28     def __init__(self,name):
29         super(Myprocess,self).__init__()
30         self.name = name
31 
32     def run(self):
33         print('子进程:\033[1;32;40m%s\033[0m 父进程:\033[1;31;40m%s\033[0m' %(os.getpid(),os.getppid()))
34         print('系统调用执行子进程,等待3秒')
35         time.sleep(3)
36 
37     @property
38     def ppid(self):
39         return os.getpid()
40 
41 
42 if __name__ == '__main__':
43     p1 = Myprocess('进程对象')
44     p1.start()
45     print('%s,的pid:\033[1;32;40m%s\033[0m' % (p1.name,p1.pid))
46     print('%s,的ppid:\033[1;31;40m%s\033[0m' % (p1.name,p1.ppid))
47     print('【主进程】:',os.getpid())
48     time.sleep(5)
进程对象获取父进程pid

 

阅读(655) 评论(0)