多任务-线程

1.多任务的概念

多任务: 在同一时间内执行多个任务,每个任务可以理解成现实生活中干的每个活。

操作系统可以同时运行多个任务。打个比方,你一边在使用浏览器上网,一边在使用网易云音乐听歌,一边在使用Word赶作业,这就是多任务。

操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。
单核cpu是并发的执行多任务,真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

2.并发:

指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

3.并行:

指的是任务数小于等于cpu核数,即任务真的是一起执行的

4.线程

#线程:可以理解成执行代码的分支,线程是执行程序中的代码的
import threading
import time

def sing():
    for i in range(3):
        print("唱歌中")
        time.sleep(0.2)

def dance():
    for i in range(3):
        print("跳舞中")
        time.sleep(0.2)

if __name__ == '__main__':
    dance_thread = threading.Thread(target=dance)
    sing_thread= threading.Thread(target=sing)

    dance_thread.start()
    sing_thread.start()



导入线程模块
#导入线程模块
import threading

线程类Thread参数说明
Thread([group [, target [, name [, args [, kwargs]]]]])
group: 线程组,目前只能使用None
target: 执行的目标任务名
args: 以元组的方式给执行任务传参
kwargs: 以字典方式给执行任务传参
name: 线程名,一般不用设置
def __init__(self, group=None, target=None, name=None,
             args=(), kwargs=None, *, daemon=None):

启动线程
启动线程使用start方法
线程的注意点

  1. 线程之间执行是无序的

  2. 主线程会等待所有的子线程结束后才结束

    import threading
    import time

    def work(num):
    for i in range(num):
    print("I am working ")
    time.sleep(0.2)

    if name == ‘main’:
    #创建子线程并指定对应的任务
    #group:线程组,一般不用,目前默认使用none
    #target:执行的目标任务名
    #name:线程名
    #args:表示以元祖传参

     # sub_thread = threading.Thread(group=None,target=work,name="myThread",args=(5,))
     # print(sub_thread)
     # sub_thread.start()
     
     
     #表示以字典方式传参,注意点key要参数名要一一对应
     sub_thread = threading.Thread(group=None,target=work,name="myThread",kwargs={"num":3})
     print(sub_thread)
     sub_thread.start()
    

自定义多线程:

import threading

class Custom_thread(threading.Thread):
    def __init__(self,info1,info2):
        #提示:如果子类提供了init方法,那么默认不会调用父类的init方法
        #解决办法:手动调用父类的初试化方法,建议:如果子类提供了init方法,需要手动调用父类的init方法
        super(Custom_thread, self).__init__()
        self.info1=info1
        self.info2= info2

    def work1(self):
        print(self.info1)

    def work2(self):
        print(self.info2)
#执行任务统一在run方法中执行
    def run(self):
        self.work1()
        self.work2()

#创建自定义线程,注意点:不需要使用target指定执行某个任务,执行任务都在run方法里执行
custom_thread=Custom_thread("work1","work2")
#启动线程统一使用start方法,start方法内部调用run方法,不要直接调用run方法
custom_thread.start()


import threading
import time

# 唱歌任务
def sing():
    # 扩展: 获取当前线程
    # print("sing当前执行的线程为:", threading.current_thread())
    for i in range(3):
        print("正在唱歌...%d" % i)
        time.sleep(1)

# 跳舞任务
def dance():
    # 扩展: 获取当前线程
    # print("dance当前执行的线程为:", threading.current_thread())
    for i in range(3):
        print("正在跳舞...%d" % i)
        time.sleep(1)

if __name__ == '__main__':
    # 扩展: 获取当前线程
    # print("当前执行的线程为:", threading.current_thread())
    # 创建唱歌的线程
    # target: 线程执行的函数名
    sing_thread = threading.Thread(target=sing)

# 创建跳舞的线程
dance_thread = threading.Thread(target=dance)

# 开启线程
sing_thread.start()
dance_thread.start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值