多线程和多进程

多任务

如果一个操作系统同时运行了多个程序,那么称这个操作系统是多任务的操作系统,windows, Ubuntu, mac,Android,ios
如果一个程序,可以同时执行多个事情,那么久成为多任务的程序

理解多任务:

  1. 一个CPU是单核默认可以执行一个程序,如果想要多个程序一起执行,理论上将就需要多个CPU
  2. 如果一个CPU是4核,理论上讲同时只能有4个任务一起执行,但是事实上却可以运行很多个程序,之所以有这个现象,是因为操作系统控制CPU, 让CPU做了一个特殊的事情,一会运行一个程序,然后快婿的运行另一个程序,在运行另外的程序,一次类推,实现了多个任务看上去“一起”运行
    操作系统为了让多个程序,能够得到执行的机会,采用了一系列的方案来实现:例如:时间片调度,任务优先级调度等

并发和并行

  • 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
  • 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
  • 真正的"并行"只能在多核CPU上实现,现实中由于任务数量远远多于CPU的核心数量,所以基本上都是“并发”。
    操作系统会自动把很多任务轮流调度到每个核心上执行。

程序

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程则是在处理机上的一次执行过程,他是一个动态的概念。其实进程是包含程序的,进程的执行离不开程序,进程中的文本区就是代码区,也就是程序。

进程

进程就是一段程序的执行过程。它是一个具有独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元。
主要有两点:第一进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二进程是一个执行中的程序。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

注:单核处理器,同时间只能处理一个进程,4核处理器同时间只能处理4个进程。

进程的三种状态

**就绪态:**其实就是获取除了cpu之外的所有资源,只要处理器分配资源就可以马上执行。简单将程序具备处理条件,只等待cpu分配资源执行
**运行态:**获得了处理器分配的资源,程序开始执行。
**阻塞态:**当程序条件不够时,需要等待条件满足时才能执行,如果等待i/o操作时候,此刻的状态就叫阻塞态

线程

**线程:**通常在一个进程中可以包含若个线程,当然一个进程中至少一个线程。线程可以利用进程所有的资源,我们把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。

多线程

多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

进程与线程的区别

1)一个程序至少有一个进程,一个进程至少有一个线程
2)线程的划分尺度小于进程,使得多线程程序的并发性高(并发:犹如一个网站可以被多个客户访问叫并发)
3)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
4) 线程在执行过程中与进程也有区别。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,有应用程序提供多个线程执行控制。
5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别

多线程实现(threading)

Python标准库中提供了两个模块:_thread和threading, threading是对_thread进行了封装,我们只需了解threading这个高级模块

import threading
from time import sleep

def run(name):
    print(name,"线程执行了")

# 建立线程
t1 = threading.Thread(target=run,args=('t1',))
t2 = threading.Thread(target=run,args=('t2',))
# target目标即需要执行的方法,此时注意方法中参数不是直接传递的。方法中参数是通过序列传递
# args参数序列,如果只有一个参数将参数传入,并加一个逗号,逗号不能省略

# 启动线程
t1.start()
t2.start()

主线程和子线程执行顺序(join())

程序执行时,程序本身就是一个线程(默认有一个线程),叫主线程
手动创建的线程,叫子线程(多任务也就可以裂解为让你的代码再运行的过程中而外创建一些线程,让这些线程运去执行代码)
主线程的执行中,不会等待子线程执行完毕,就会直接执行后面的代码。为保障主线程在子线程执行完毕后再执行后面程序,可以使用join()方法。

import threading
from time import sleep

def run(name):
    print(name,"线程执行了")
    sleep(10)
t1 = threading.Thread(target=run,args=

你可能感兴趣的:(python,python,多线程)