返回顶部
首页 > 资讯 > 后端开发 > Python >Python中多线程总结
  • 868
分享到

Python中多线程总结

多线程Python 2023-01-31 02:01:01 868人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

Python中的多线程多线程一个进程中有多个线程就是多线程。一个进程中至少有一个线程,并作为程序的入口,这个就是主线程。一个进程至少有一个主进程,其他线程称为工作线程。线程安全:线程执行一段代码,不会产生不确定的结果,那这段代码就是线程安全

Python中的多线程


多线程


一个进程中有多个线程就是多线程

一个进程中至少有一个线程,并作为程序的入口,这个就是主线程。一个进程至少有一个主进程,其他线程称为工作线程。


线程安全:线程执行一段代码,不会产生不确定的结果,那这段代码就是线程安全。(例如print()线程不安全)



线程的daemon属性


daemon属性:表示线程是否是daemon线程,这个值必须在start()之前设置,否则引发RuntimeError异常

isDaemon():是否是daemon线程

setDaemon():设置为daemon线程,必须在start方法之前设置


线程具有一个daemon属性,可以设置为Ture或False,也可以不设置,默认值为None.如果不设置daemon就取当前的daemon来设置它,主线程是Non-daemon。工作线程不设置daemon属性,则默认是daemon = False .python程序在没有活着的non-daemon线程运行时退出。



join()方法

join(timeout)是线程的标准方法之一。

一个线程中调用里那个一个线程的join方法,调用者将被阻塞,知道盗用线程终止。一个线程可以被join多次。



daemon线程的应用场景

1:后台任务,如发送心跳包、监控,这种场景最多

2:主线程工作才有用的线程,如主线程中维护的公共资源,主线程已经清理了,准备退出,而工作线程使用这些资源工作也没有意义了,一起退出最合适。

3:随时可以被终止的线程


threading.local类

运行时,threading.local实例处在不同的线程中,就从大字典中找到当前线程相关键值对中的字典,覆盖threading.local实例的__dict__。这样就可以在不同的线程中,安全德使用线程独有的数据做到线程间数据隔离,如同本地变量一样安全。


定时器Timer/延迟执行


threading.Timer(interval,function,args=None,Kwargs=None)

start方法执行之后,Timer对象会处于等待状态,等待了interval秒之后,开始执行function函数的。Timer提供了cancel方法,用来取消一个未执行的函数。


Event

是线程间通信机制中最简单的实现,使用一个内部的标记flag,通过flag的True或False的表换来进行操作。

set():标记设置为Ture

clear():标记设置为False

is_set():标记是否为Ture

wait(timeou):设置等待标记为Ture的时长,None为无限等待,等到返回Ture,未等到超时了返回False


Event的wait优于time.sleep,他会更快的切换到其它线程,提高并发效率。


lock


,凡是存在共享资源争抢的地方都可以使用锁,从而保证只有一个使用者可以完全使用这个资源。一旦线程获得锁,其他试图获取锁的线程将被阻塞。

acquire(blocking=True,timeout=-1):默认阻塞,阻塞可以设置超时时间,非阻塞时,timeout禁止设置。成功获取锁,返回True,否则返回Flase

release():释放锁,可以从任何线程调用释放。已上锁的多,会被重置未unlocked。未上锁的调用,会派出RuntimeError异常。


加锁、解锁

一般来说,加锁就需要解锁,但加锁后解锁前,还有一些代码执行,就有可能抛出异常,一旦出现异常,锁无法释放,但是当前线程可能因为这个异常被终止了,这就产生了死锁。

加锁、解锁常用的语句:

1:使用try ... funally语句保证锁的释放

2:with上下文管理,锁随想支持上下位管理。


锁的应用:

锁适合用于访问和修改同一个共享资源的时候,即读写同一个资源的时候。

注意事项:

1:少用锁,必要时使用锁,使用了锁,多线程访问被锁的资源时,就成了串行,要么排队执行,要么争抢执行。

2:加锁时间越短越好,不需要就立即释放。

3:一定要避免死锁。


Rlock可重入锁

可重入锁,是线程相关的锁。可在一个线程中获取锁,并可继续在同一个线程中不阻塞获取锁,当锁为释放完,其他线程获取锁就会阻塞。知道当前持有锁的线程释放完锁。



Conditon

构造方法Consition(lock=None),可以传入一个Lock或者Rlock对象,默认是Rlock


acquire(*args):获取锁

wait(self.timeout=None):等待或超时

notify(n =1):唤醒至多指定数目个数的等待的线程,没有线程等待的线程就没有任何操作

notify_all():唤醒所有等待的线程

condition用于生产者,消费者模型,为了解决生产者消费者速度匹配的问题。由于condition内部使用了锁,最好的方式是使用with上下文。


Barrier

Barrier(parties,action=None,timeout=None):构建Barrier对象,指定参与方数目。timeout是wait方法未指定超时的默认值。

n_waiting:当前在barrier中等待的线程数

parties:资源的个数。

broken:如果broken处于打破的状态,放回True

abort():将将barrier置于broken状态,等待中的线程或者调用等待方法的线程中都会抛出BrokenBarrierError异常,知道reset方法来恢复barrier

reset():恢复barrier,重新开始拦截。


wait方法超时发生,barrier将处于broken状态,知道reset()


semaphore信号量

Semaphore(value=1):构造方法,value小于0,抛ValueError异常

acquite(blocking=True,timeout=None):获取信号量,计数器减1,获取成功返回True

release():释放信号量,计数器加1


semaphore问题

如果遇到release释放次数大于初始值,计数器会增加,超过我们的最大值。

解决方法:

使用Boundedsemaphore类,有界信号量,不允许使用release超出初始值的范围,否则派出ValueError异常。


锁和信号量

锁,只允许同一个时间一个线程独占资源,它是特殊的信号量,即信号量计数器初始值为1.

信号量,可以多个线程访问共享资源,但这个共享资源数量有限。

锁,可以看做特殊的型号量。


--结束END--

本文标题: Python中多线程总结

本文链接: https://lsjlt.com/news/186735.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中多线程总结
    Python中的多线程多线程一个进程中有多个线程就是多线程。一个进程中至少有一个线程,并作为程序的入口,这个就是主线程。一个进程至少有一个主进程,其他线程称为工作线程。线程安全:线程执行一段代码,不会产生不确定的结果,那这段代码就是线程安全...
    99+
    2023-01-31
    多线程 Python
  • Python多线程与多进程相关知识总结
    目录一、什么是进程二、什么是线程三、并发、并行3.1 并发3.2 并行四、多线程适用场景五、Python GIL六、Python多线程、多进程实例:CPU 密集型任务6.1 单线程6...
    99+
    2024-04-02
  • Python 多线程超详细到位总结
    目录多线程threading线程池线程互斥lock与Rlock的区别技术交流在实际处理数据时,因系统内存有限,我们不可能一次把所有数据都导出进行操作,所以需要批量导出依次操作。为了加...
    99+
    2024-04-02
  • Python控制多进程与多线程并发数总结
    一、前言 本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够...
    99+
    2022-06-04
    多线程 进程 Python
  • Python中并发、进程、线程的总结
    并发同时做某些事,但是强调,一段时间内有事情要处理。并发的解决1:队列、缓冲区使用队列解决资源使用的问题,先进先出,其实就是一个缓冲区。2:争抢抢到资源就上锁,排他性的锁,其它只能等候。3:预处理提前加载用户需要的数据,缓存。4:并行通过多...
    99+
    2023-01-31
    线程 进程 Python
  • Java 多线程学习总结3
    在上一篇中,我们当然希望a++,b++执行完之后,show方法再来show.我们需要的是“原子”动作,一次性地把a++,b++不间断地执行。在java中是利用“互斥”的方法,互斥谁呢?互斥的是相同对象的加锁代码。如果我们把第一篇的SomeB...
    99+
    2023-01-31
    多线程 Java
  • python 实现多线程的三种方法总结
    1._thread.start_new_thread(了解) import threading import time import _thread def job(): ...
    99+
    2024-04-02
  • Java多线程之ThreadLocal原理总结
    目录1、什么是 ThreadLocal:2、ThreadLocal 的数据结构:3、ThreadLocal 的核心方法: 1、set()方法: 2、get()方法...
    99+
    2023-05-15
    Java多线程ThreadLocal 原理 Java多线程 ThreadLocal 原理
  • Python进阶之多线程的实现方法总结
    目录线程Python中的多线程threading.Thread () 创建线程继承 threading.Thread 类的线程创建主线程使用daemon参数控制过程使用.join()...
    99+
    2023-05-16
    Python多线程实现方法 Python多线程实现 Python多线程
  • Python 多线程知识点总结及实例用法
    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这...
    99+
    2024-04-02
  • Java多线程知识点全面总结
    目录Java多线程知识点总结(1)什么是进程什么是线程?(2)多线程的运行状态(3)线程的创建和使用(4)Runnable 接口实现多线程(5)Callable接口实现多线程多线程常...
    99+
    2024-04-02
  • iOS开发中多线程的安全隐患总结
    资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象、同一个变量、同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安...
    99+
    2022-05-27
    iOS 多线程 安全隐患
  • Python一些线程的玩法总结
    目录一、线程基础以及守护进程二、线程锁(互斥锁)三、线程锁(递归锁)四、死锁五、队列六、相关面试题七、判断数据是否安全八、进程池 & 线程池一、线程基础以及守护进程 线程是C...
    99+
    2024-04-02
  • 运用示例详细总结Java多线程
    目录进程与线程Java中线程实现的方式实现 Runnable 接口继承 Thread 类Thread 类和 Runnable 接口线程的状态变化取得和设置线程的名称线程的操作方法线程...
    99+
    2024-04-02
  • python 下划线的多种应用场景总结
    目录一、_用于临时变量1.1 REPL1.2 for循环中的_1.3 元组拆包中的_1.4 国际化函数1.5 大数字表示形式二、var_用于解决命名冲突问题三、_var用于保护变量3.1 突破保护属性四、__var用...
    99+
    2022-06-02
    python 下划线 python 下划线应用场景
  • python线程池的四种好处总结
    1、使用好处 提高性能:由于减去了大量新建终止线程的费用,重用了线程资源; 适用场景:适用于处理大量突发请求或需要大量线程完成任务,但实际任务处理时间短。 防御功能:可以有效避免系统因线程过多而导致系统负载过大而相应...
    99+
    2022-06-02
    python 线程池
  • Android SQLite3多线程操作问题研究总结
    最近做项目时在多线程读写数据库时抛出了异常,这自然是我对SQlite3有理解不到位的地方,所以事后仔细探究了一番。 1.关于getWriteableDataBase()和get...
    99+
    2022-06-06
    sqlite3 多线程 SQLite 线程 Android
  • Java多线程的常用创建方式总结
    Java多线程的创建方式 Java现在有四种创建的方式:继承Threa类、实现Runnable接口、实现Callable接口、线程池 Thread、Runnable都在java.la...
    99+
    2024-04-02
  • Java多线程和并发常见问题总结
    这篇文章主要讲解了“Java多线程和并发常见问题总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程和并发常见问题总结”吧!Java多线程问题1:进程和线程之间有什么不同一个进程...
    99+
    2023-06-17
  • java 多线程的几种实现方法总结
    java 多线程的几种实现方法总结1.多线程有几种实现方法?同步有几种实现方法?多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与noti...
    99+
    2023-05-30
    java 多线程 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作