多进程与多线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程与多线程相关的知识,希望对你有一定的参考价值。
什么是进程?
进程就是一个程序在一个数据集上的一次动态执行过程。
进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
单核CPU对进程进行切换的过程叫做并发,并发的概念就是进程在执行过程中,需要切换到另一个进程时,保留现在进程状态,运行其他进程。看似是程序同时进行,其实并不是,只是切换的过程快。
多核cpu对进程进行切换的过程叫做并行,并行就是进程可以同时在cpu中执行,是实际意义的同时共同执行。
什么是线程?
线程的出现解决了一个进程只能做一件事的缺陷,实现了上下文管理。线程之间共用数据集。
进程和线程之间的联系
进程在之前计算机系统中是一个执行单位,当线程出现的时候,线程成了一个实际意义的执行单位。
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。或者说进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
总结性的来说,进程是一个资源管理单位,线程是一个最小的执行单位。
一个进程中可以有多个线程(必须有一个线程),一个线程的执行,必须有一个进程。
并发与并行的详细分析
并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集
python中使用多线程示例:
直接定义多线程,(线程在使用中都是一个个对象,所以需要在使用时先实例化线程类)
1 import threading 2 import time 3 4 def countNum(n): # 定义某个线程要运行的函数 5 6 print("running on number:%s" %n) 7 8 time.sleep(3) 9 10 t1 = threading.Thread(target=countNum,args=(23,)) #生成一个线程实例 11 t2 = threading.Thread(target=countNum,args=(34,)) 12 13 t1.start() #启动线程 14 t2.start() 15 16 print("ending!")
继承的方式使用多线程
import threading,time #其实python中程序本身就是一个主线程,当开启其他线程后,主线程依旧会进行 class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) #super().__init__(self) self.num=num def run(self): print("打印参数",self.num) print("子进程",self) t1=MyThread(10)#实例化线程 t2=MyThread(20) t1.start()#开启线程 t2.start() print("主进程结束")
全局解释器锁GIL
python代码的执行是由python解释器(解释器主循环)进行控制。python在设计之初考虑到主循环中只能有一个控制线程在执行,就像单核cpu下的多进程一样。内存中有多个程序,但是在给定时刻只能有一个程序在运行。python解释器中尽管也能运行多个线程,但是在给定时刻只有一个线程会被执行。
多线程下的python的执行方式
1.设置GIL
2.切换到一个线程去运行
3.执行操作
指定 数量的字节码指令
线程主动让出控制权(可以调用time.sleep()完成)
4.把线程设置回睡眠状态(切换出线程)
5.解锁GIL
守护进程
什么是守护进程?
守护进程进程就是一个随着著进程结束而结束的进程。通常这类进程是不重要的。设置守护的进程的语法为:在进程之前执行赋值语句thread.daemon=True
join方法
join的使用就是线程对象调用join方法,表示该线程不结束,不执行主线程。主线程在执行时,会等待该线程完成后再执行。
以上是关于多进程与多线程的主要内容,如果未能解决你的问题,请参考以下文章