进程三状态
例子
开始进程的两种方式
第一种:常用
from multiprocessing import Processimport timedef task(name):print('{} is running'.format(name))time.sleep(1)print('{} is over'.format(name))if __name__ == '__main__':"""创建进程:windows操作系统下, 创建进程一定要在main内创建因为windows下创建进程类似于模块导入的方式,会从上到下依次执行代码(__main__表示为可执行文件,而非导入,不会进入死循环)"""# 1. 实例化:创建一个对象。"""args为task函数的参数"""p = Process(target=task, args=("wy",))# 2. 开启进程p.start() # 告诉操作系统帮你创建一个进程print("主进程")time.sleep(2)print("over")# 输出"""主进程wy is runningwy is overover"""
第二种:类的继承
from multiprocessing import Processimport timeclass MyProcess(Process):def __init__(self, name):super(MyProcess, self).__init__()self.name = namedef run(self):print('{} is running'.format(self.name))time.sleep(1)print('{} is over'.format(self.name))if __name__ == '__main__':# 1. 实例化:创建一个对象p = MyProcess("wy")# 2. 开启进程p.start() # 告诉操作系统帮你创建一个进程print("主进程")time.sleep(2)print("over")
总结
- 创建进程就是在内存中申请一块内存空间将需要运行的代码放入该内存空间
- 一个进程对应在内存中就是一块独立的内存空间
- 多个进程对应在内存中就是对块独立的内存空间
进程与进程之间,数据不共享,如果像共享,需要使用第三方工具、模块
join方法
-
例子1
```python from multiprocessing import Process import time
def task(name, n): print(‘{} is running’.format(name)) time.sleep(n) print(‘{} is over’.format(name))
if name == ‘main‘: “”” 创建进程: windows操作系统下, 创建进程一定要在main内创建 因为windows下创建进程类似于模块导入的方式,会从上到下依次执行代码 (main表示为可执行文件,而非导入,不会进入死循环) “””
# 1. 实例化:创建一个对象。p1 = Process(target=task, args=("wy", 1))p2 = Process(target=task, args=("A", 2))p3 = Process(target=task, args=("C", 3))start_time = time.time()# 2. 开启进程p1.start() # 告诉操作系统帮你创建一个进程,只是创建了p2.start()p3.start()p1.join() # join: 主进程等待子进程结束后运行p2.join()p3.join()print("主进程")print("over")total_time = time.time() - start_timeprint(total_time)
问:total_time大概是多少?
答:结果是3s多,而不是6s多。虽然join的意思是等待子进程结束后主进程再运行。 但是多个子进程是并发运行的,而不是串行,所以不需要等待6s 另外这3个子进程的执行顺序是不固定的(并不知道谁先被创建好)
<a name="ye0Yq"></a>## 例子2```pythonif __name__ == '__main__':# 1. 实例化:创建一个对象。start_time = time.time()for i in range(1, 4):p = Process(target=task, args=("第{}个进程".format(i), i))# 2. 开启进程p.start()p.join()print("主进程")print("over")total_time = time.time() - start_timeprint(total_time)# 问:total_time大概是多少?答:结果是6s多。因为for循环时第一个不结束,第二个也不会进入循环
例子3:改进例2的串行
if __name__ == '__main__':# 1. 实例化:创建一个对象。start_time = time.time()p_list = [] # 先放入就绪队列for i in range(1, 4):p = Process(target=task, args=("第{}个进程".format(i), i))# 2. 开启进程p.start()p_list.append(p)for p in p_list:p.join()print("主进程")print("over")total_time = time.time() - start_timeprint(total_time) # 3s多
进程之间数据互相隔离
from multiprocessing import Processmoney = 100def task():global money # 将局部变量升为全局变量money = 666print("子进程:", money)if __name__ == '__main__':p = Process(target=task)p.start()p.join()print("主进程:", money)
进程对象和其他方法
"""一台计算机上运行着很多进程,计算机是如何区分并管理这些进程服务端的呢?每个运行的进程都有一个PID号如何查看?- windows电脑:cmd中输入tasklist即可查看- windows查找进程号:tasklist | findstr PID- linux 和 mac : ps aux- 查找进程号:ps aux | grep PID"""#查看当前的进程号# 方法一from multiprocessing import current_processcurrent_process().pid # 查看当前进程号# 方法二import osos.getpid() # 查看当前进程号os.getppid() # 查看当前进程的父进程号# 杀死当前进程p.terminate() # 但是只是告诉操作系统去帮你杀死当前进程,但是需要一定时间,而代码运行速度极快time.sleep(0.1) # 所有给一点时间print(p.is_alive()) # 才能真正看起来不存活
进程之间相互通信
- 需要借助第三方模块
- 可以用队列(管道+锁),管道等 ```python from multiprocessing import Process, Queue import time
“”” 进程之间相互通信分两种:
- 父进程和子进程之间相互通信
- 子进程和子进程之间相互通信 “””
def product(q): q.put(“new params”) # 2. 向队列放参数 print(“hello”)
if name == ‘main‘: q = Queue() # 1. 创建队列 p = Process(target=product, args=(q,)) p.start() print(q.get()) # 3. 从队列中取任务,这里get不需要加join,没有数据就会等待
```pythonfrom multiprocessing import Process, Queueimport timedef product(q):q.put("new params") # 2. 向队列放参数q.put("second")print("hello")def consume(q):print(q.get()) # 一个子进程放,一个子进程取if __name__ == '__main__':q = Queue() # 1. 创建队列p = Process(target=product, args=(q,))p1 = Process(target=consume, args=(q,))p.start()p1.start()print(q.get()) # 3. 从队列中取任务,这里get不需要加join,没有数据就会等待
parse 模块
import argparseparser = argparse.ArgumentParser()parser.add_argument('--foo', help='foo help')args = parser.parse_args()
https://zhuanlan.zhihu.com/p/526749594
