20240714--多线程-1

1、多线程-1

1.1、引入多任务

就是可以同时运行多个任务,比如一边上网,一边听歌,一边使用word写文章等,这就是多任务。

from time import sleep

def sing():
    for i in range(3):
        print("正在唱歌...%d" % i)
        sleep(1)

def dance():
    for i in range(3):
        print("正在跳舞...%d" % i)
        sleep(1)

if __name__ == "__main__":
    sing()  # 唱歌
    dance() # 跳舞

运行结果就为:

正在唱歌...0
正在唱歌...1
正在唱歌...2
正在跳舞...0
正在跳舞...1
正在跳舞...2

所以这就不是多任务并发进行,要对代码进行修改,则修改为如下:

from time import sleep
import threading
def sing():
    for i in range(3):
        print("正在唱歌...%d" % i)
        sleep(1)

def dance():
    for i in range(3):
        print("正在跳舞...%d" % i)
        sleep(1)

if __name__ == "__main__":
    t1 =  threading.Thread(target = sing)
    t2  = threading.Thread(target = dance)
    t1.start()
    t2.start()

运行结果为:

正在唱歌...0
正在跳舞...0
正在跳舞...1
正在唱歌...1
正在唱歌...2
正在跳舞...2
 

这便是多任务进行运行。

1.2、什么是多任务

1.2.1、多任务

  1. 同时可以进行多个任务,比如在电脑上同时进行多个任务,比如电脑边听歌边用word,如果在一个操作系统上同时运行了多个程序,那么称这个操作系统是多任务的操作系统,Windows、Ubuntu、mac、Andriod、ios
  2. 如果一个程序,可以同时执行多个事情,那么就称为多任务程序

1.2.2、多任务执行的原理

  1. 一个cpu是单核,默认可以执行一个程序,如果想要执行多个程序一起执行,理论上就需要多个cpu来执行。
  2. 单核cpu是怎么执行多任务的呢?真相只有一个--那就是:如果一个cpu是4核,理论上将同时只有4个任务能一起执行,但是事实上却可以运行很多个程序,之所以有这个现象,是因为操作系统控制着cpu,让cpu做了一个特殊的事情,一会运行一个程序,然后快速的运行另外一个程序,再运行另外的程序,以此类推,实现了多个任务看起来再“一起”运行。
  3. 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行到0.01秒,再切换到任务3,执行0.01秒,这样反复执行下去,表面上看,每个任务都是交替执行的,但是,由于cpu的执行速度实在是太快了,我们就感觉像是所有任务都在同时执行。操作系统为了让多个程序都能够得到的执行的机会,采用了一系列的方案来实现,例如:时间片的调度。  --所以这是假的多任务。但是多核cpu才是真正多任务,但是一般达不到真正的条件,一般都是假的。cpu的核心数少于你所要执行你的任务数,便是假的。

1.2.3、并发、并行

  • 并发:是一个对假的多任务的描述
  • 并行:是对一个真的多任务的描述
  • python中实现多任务有两种方式,一个是线程,一个是进程。

1.3、线程

简单理解为程序在执行代码时的那个执行流。

1.4、通过线程理解多任务

  1. 当一个程序运行时,默认有一个线程,这个线程我们称之为主线程。
  2. 多任务:也就可以理解为让你的代码在运行过程中额外创建一些线程,让这些线程去执行代码。
  3. 在python中想要通过线程去实现多任务,可以使用很底层的thread模块,那么意味着过程可能较为复杂不方便,使用threading模块可以更加方便使用。

1.5、使用threading模块

1.5.1、单线程执行时

​
import time

def say_sorry():
    print("我错了")
    time.sleep(1)


for i in range(5):
    say_sorry()

​

运行结果:

我错了
我错了
我错了
我错了
我错了

1.5.2、多线程执行时

import threading # 一个模块
import time

def say_sorry():
    print("我错了")
    time.sleep(1)


for i in range(5):
    t  = threading.Thread(target = say_sorry) # Thread是一个类,创建出来的对象找了一个t作为变量,创建出来的对象是一个新的线程,但是他并不会立刻执行
                                              # 括号里面的等于是传参数,关键字参数
    t.start() # 启动线程,即让线程开始执行。

!!!创建了一个对象,在开始执行

使用threading模块

# 1. 导入threading模块
import  threading
import time

def task_1():
    while True:
        print("11111")
        time.sleep(1)
# 2.使用threading模块中的Thread创建一个对象
t1 = threading.Thread(target = task_1)

# 3.调用这个实例对象的start方法让这个线程开始运行
t1.start()



while True:
    print("222222")
    time.sleep(1)

运行结果

11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
11111
222222
222222

小结:!

  1. 想要执行一个单独的任务,那么就需要创建一个新的线程。
  2. 在python中使用threading模块中的Thread类,就可以创建一个对象,这个对象标记着线程,创建出来的线程默认是不会执行的。
  3. 调用这个线程对象的start方法,就可以让这个新的线程开始执行代码,至于这个线程去执行哪里的代码,要开在用Thread创建对象的时候给target参数传递的是哪个函数的引用,即将来线程就会执行target参数指明的那个函数。
  4. 如果想在一个程序中有多个任务一起运行,那么就创建多个Thread对象即可。
  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值