python进阶笔记之多线程

1、了解并发
一个cpu 执行一个a线程,然后执行一个b线程,然后执行一个c线程,当切换执行的速度非常快时,可以看作是三个线程是一起执行的(类似于一只手快速来回晃动,可以看到很多只手,其实只要一只手,速度足够快,看成了多只手同时存在了)
并发:逻辑上具备同时处理多个任务的能力
并行:物理上在同一时刻执行多个并发任务
2、了解线程和进程
在这里插入图片描述
在这里插入图片描述
3、启动线程Thread:线程Thread是一个类,在创建一个线程类对象时,有两个注意****点:第一是类的成员如果不指定,则会默认从第一开始赋值;第二是类的target是带参函数时,如下foo函数,则传参的参数args必须是[]列表或者()元组方式传参,注意(1)这种形式python是识别不出来这是一个元组的需要写成(1,)
不指定成员报错:
在这里插入图片描述
函数传参不是列表报错:
在这里插入图片描述

# -*- coding:utf-8 -*-
import threading, time

def foo(something):
    for i in range(30):
        print("cpu正在执行", something)
        time.sleep(1)
        
t1 = threading.Thread(None, foo, None, ["写入数据",])
t2 = threading.Thread(None, foo, None, ["读取数据",])

t1.start()
t2.start()

for i in range(10):
    print("这是主线程")
    time.sleep(1)

执行结果:
在这里插入图片描述
4、多线程锁:控制是否 等待线程 执行完成:在没有手动控制时,默认一个主进程中如果包含 子线程,即便主进程已经结束,但是还是会等待子线程执行结束才会 完成。但有时候,主进程会抢线程的资源,或者线程没那么重要不需要等待,这就引入了join和setDaemon
join等待子线程------指得是,在并发子线程和主线程同时运行时,两个任务都会去抢cpu运行,为了使得 主线程不去抢,使用 t1.join() 即可实现让主线程处于等待阻塞状态,直到t1的线程执行结束才会释放。在start方法开始后进行,如下:
在这里插入图片描述
运行结果:只有并发在进行了,主线程未进行 掺和 抢资源
在这里插入图片描述
setDaemon(true)不等待子线程------如果不设置,则默认主线程是需要等待子线程的。在子线程完成后主线程才能结束。设置时,在start方法开始前进行,如下:
在这里插入图片描述
执行结果:主线程完成会直接结束
在这里插入图片描述
5、结论
IO密集型运行任务:指多个输入输出任务,而多个任务之间是有等待时间的,其中一个任务休眠了等待了就会切换任务执行(cpu不停歇继续去执行其他io任务),这种多线程运行 大大节省了操作时间
应用:SQL的查询操作,接口调用如发起请求后等待服务器返回
cpu运算密集型执行任务:cpu需要一直不停的运算,所以使用多线程不会节约运行时间。
6、多线程条件变量
同步锁:在主线程声明锁,在每个协程里加锁,释放锁,即可。(特点:只能上一次锁,其他抢不到锁,需要成对出现)
在这里插入图片描述
递归锁:当同步锁无法解决问题时,比如出现死锁,就需要用到递归锁:lock= threading.Rlock()(特点,可多次上锁,上锁时+1,解锁-1,最小为0)
在这里插入图片描述
条件变量
当某个操作,需要某前提下才加锁,某前提下需要设置成等待阻塞,某条件下需要被唤醒,那么拥有这些功能方法的 锁,叫条件变量:lock_con = lock.condition,这个锁类的方法如下。
测试场景:在有上下文依赖的时候用到
在这里插入图片描述
信号量:指闲置量,或者可以操作加锁的量
在这里插入图片描述
如下代码:定义得信号量,规定了同一时间最多的闲置数
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值