1 1、 进程理论
2 并发、并行、串行
3 进程运行的三种状态:(运行态、就绪态)非阻塞态、阻塞态
4 调用任务的两种方式:同步调用、异步调用
5 2、 进程的使用
6 process
7
8 #1、什么是进程
9 进程是一个程序运行的过程
10
11 #2、什么是程序
12 程序就是一堆代码文件
13
14 #3、串行、并发、并行
15 串行:多个任务依次运行,一个运行完毕再运行下一个
16 并行:多个任务是真的在同时运行,只有多个cpu才有并行的概念
17 并发:多个任务看起来是在同时运行
18
19 #4、进程的创建
20 windows:CreateProcess
21 linux:fork
22 对于通用系统,需要有系统运行过程中创建或撤销进程的能力,主要分为4种形式创建新的进程
23 1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)
24 2. 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
25 3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)
26 4. 一个批处理作业的初始化(只在大型机的批处理系统中应用)
27
28 无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的:
29 1. 在UNIX中该系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像、同样的环境字符串和同样的打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)
30 2. 在windows中该系统调用是:CreateProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程。
31
32 关于创建的子进程,UNIX和windows
33 1.相同的是:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另外一个进程。
34 2.不同的是:在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于windows系统来说,从一开始父进程与子进程的地址空间就是不同的。
35
36 #5、进程的终止
37 1. 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)
38 2. 出错退出(自愿,python a.py中a.py不存在)
39 3. 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try...except...)
40 4. 被其他进程杀死(非自愿,taskill /F /PID 3333)
41
42 #6、程序运行的三种状态
43 运行态
44 就绪态
45 阻塞态
46
47
48 优化程序效率的核心法则:降低IO操作(硬盘IO、网络IO)
49 内存-->本地硬盘-->网络IO
50
51 #7、
52 进程运行的三种状态:(运行态、就绪态)非阻塞态、阻塞态
53 调用任务的两种方式:同步调用、异步调用
54
55
56
57 # import os
58 # import time
59 #
60 # print(os.getpid())
61 # time.sleep(1000)
62 # 可通过管理员cmd输入 ”taskkill /f /pid '进程id' “ 终止进程
63
64 # 启动子进程
65 # 方式一
66 # from multiprocessing import Process
67 # import time
68 # import os
69 #
70 #
71 # def task(n, tag):
72 # print('%s is running' % tag)
73 # time.sleep(n)
74 # print('%s is done' % tag)
75 #
76 #
77 # if __name__ == '__main__':
78 # p1 = Process(target=task, args=(5, '子进程1')) # 创建进程对象
79 # p2 = Process(target=task, args=(3, '子进程2'))
80 # p3 = Process(target=task, args=(2, '子进程3'))
81 # p1.start() # 启动子进程
82 # p2.start()
83 # p3.start()
84 # print('主进程--->%s' % os.getpid())
85
86 # 方式二
87 # from multiprocessing import Process
88 # import time
89 # import os
90 #
91 #
92 # class Myprocess(Process):
93 # def __init__(self, tag):
94 # super(Myprocess,self).__init__()
95 # self.tag = tag
96 #
97 # def run(self) -> None:
98 # print('%s is running.' % self.tag)
99 # time.sleep(3)
100 # print('%s is done.' % self.tag)
101 #
102 #
103 # if __name__ == '__main__':
104 # p1 = Myprocess('子进程1') # 创建进程对象
105 # p2 = Myprocess('子进程2')
106 # p3 = Myprocess('子进程3')
107 # p1.start() # p1.run()
108 # p2.start()
109 # p3.start()
110 # print('主进程--->%s' % os.getpid())
111
112
113 # join # 使主进程等待当前子进程运行结束后再运行后续代码
114 # (1)
115 # from multiprocessing import Process
116 # import time
117 # import os
118 #
119 #
120 # def task(n, tag):
121 # print('%s is running' % tag)
122 # time.sleep(n)
123 # print('%s is done' % tag)
124 #
125 #
126 # if __name__ == '__main__':
127 # p1 = Process(target=task, args=(5, '子进程1'))
128 # p1.start()
129 # p1.join() # p1.join(timeout=3) timeout指定时间,经过指定时间后无论进程是否结束都会开始运行后续代码
130 # print('主进程--->%s' % os.getpid())
131
132 # (2)串行
133 # from multiprocessing import Process
134 # import time
135 # import os
136 #
137 #
138 # def task(n, tag):
139 # print('%s is running' % tag)
140 # time.sleep(n)
141 # print('%s is done' % tag)
142 #
143 #
144 # if __name__ == '__main__':
145 # p1 = Process(target=task, args=(5, '子进程1'))
146 # p2 = Process(target=task, args=(3, '子进程2'))
147 # p3 = Process(target=task, args=(2, '子进程3'))
148 # start = time.time()
149 # p1.start()
150 # p1.join()
151 #
152 # p2.start()
153 # p2.join()
154 #
155 # p3.start()
156 # p3.join()
157 # end = time.time()
158 # print(end - start)
159 # print('主进程--->%s' % os.getpid())
160
161
162 # (3)并发
163 # from multiprocessing import Process
164 # import time
165 # import os
166 #
167 #
168 # def task(n, tag):
169 # print('%s is running' % tag)
170 # time.sleep(n)
171 # print('%s is done' % tag)
172 #
173 #
174 # if __name__ == '__main__':
175 # p1 = Process(target=task, args=(5, '子进程1'))
176 # p2 = Process(target=task, args=(3, '子进程2'))
177 # p3 = Process(target=task, args=(2, '子进程3'))
178 #
179 # start = time.time()
180 # p1.start()
181 # p2.start()
182 # p3.start()
183 #
184 # p1.join()
185 # p2.join()
186 # p3.join()
187 # end = time.time()
188 # print(end - start)
189 # print('主进程--->%s' % os.getpid())
190
191
192 # 注意:是主进程等待,子进程不受影响
193 # from multiprocessing import Process
194 # import time
195 # import os
196 #
197 #
198 # def task(n, tag):
199 # print('%s is running' % tag)
200 # time.sleep(n)
201 # print('%s is done' % tag)
202 #
203 #
204 # if __name__ == '__main__':
205 # p1 = Process(target=task, args=(5, '子进程1'))
206 # p2 = Process(target=task, args=(3, '子进程2'))
207 # p3 = Process(target=task, args=(2, '子进程3'))
208 #
209 # start = time.time()
210 # p1.start()
211 # p2.start()
212 # p3.start()
213 #
214 # p3.join()
215 # p1.join()
216 # p2.join()
217 #
218 # end = time.time()
219 # print(end - start)
220 # print('主进程--->%s' % os.getpid())