这段时间使用python做串口的底层库,用到了多线程,对这部分做一下总结。实际用完了后再回过头去看python的官方帮助文档,感觉受益匪浅,把里面的自己觉得有用的一些关键点翻译出来,留待后续查验。

threading是thread的高级接口模块,包括了除了thread模块,还有mutex模块、queue模块、dummy_threading模块方面的内容。

该模块定义了一下几方面的函数和对象:

threading.activeCount() :返回现存在活动状态的线程数。返回的数目等于enumerate()列表的长度。

threading.Condition():是返回一个新的condition变量类型的工厂函数(返回对象的函数)。一个condition类型的变量允许一个或多个线程等待,直到被另一个线程通知。

threading.currentThread() :根据用户线程句柄,返回当前的线程对象。如果线程句柄并未通过threading模块创建,有限功能的哑线程会被创建。

threading.enumerate() :返回所有活动线程对象列表。包括守护线程、由current_thread()创建的哑线程以及主线程。不包括终止了的线程和未开始的线程。

threading.Event() :是返回一个新的event类型的工厂函数。一个event管理一个标识,可以使用set()方法设置为true,也可以由clear()方法重置为false。wait()方法会阻塞直到这个标识为true。

class threading.local:代表线程本地数据的类。线程本地数据是该线程独有的。通过创建一个local实例,可以管理线程本地数据,并且能存储其属性。如:

mydata = threading.local()

mydata.x = 1

该属性的值因线程不同而异。

threading.Lock() :是一个返回新的单锁对象的工厂函数。只要一个线程获取该锁,相关其他要获取该锁的线程都会阻塞,直到锁被释放。任何线程都可以释放它。

eg:

testLock=threading.Lock()

testLock.acquire()#对锁的使用,也可以不用acquire()和release,直接使用with testLock:即可

self._test=True

testLock.release()

(注意:互斥锁用来锁定不同线程中的互斥量,锁的内容尽可能简洁,只锁定必须互斥的部分,以节省线程运转的时间)

threading.RLock() :返回一个可重入锁的工厂函数。可重入锁必须由创建它的线程释放。一旦一个线程获取了一个可重入锁,同一线程内可以继续获取它而不阻塞。线程获取了几次可重入锁,必须释放同样的次数。

(在此次项目实践中,重锁没有用到,但知道了这样的场景,即同一线程,如果锁中间调用的函数,有用到同样的锁,如果用单锁,会发生死锁,而用可重入锁,不会发生阻塞,可以防止这样场景下的死锁。)

threading.Semaphore([value]) :是返回一个新的信号量对象的工厂函数。信号量管理一个计数器,代表调用release()的个数减去调用acquire(),再加上初始值的数目。当该值为负数时,acquire()方法会阻塞。value的默认值是1。

(当时考系统分析师,对于信号量总是理解的很抽象,其实就是控制线程同步和互斥量的。当初创建这一概念的科学家使用p()和V()取代了acquire()和release()。信号量管理一个内部计数器,每调用一个acquire()就递减一次,每调用release()就递增一次。这个计数器不能小于0。一旦调用acquire()时发现它小于0,则线程阻塞,直到其他线程调用release()。)

class threading.Thread:代表线程句柄的类。

threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。

thread是线程类,有两种使用方法,直接传入要运行的方法(推荐,简便)或从thread继承并覆盖run()。一旦线程对象被创建,必须调用线程的start()方法开始线程。这一操作会唤醒每个线程的run()方法。当线程开始后,这个线程被认为是活动的。当它的run()方法终结,线程就结束了,或者通常的做法是,是触发一个不能处理的异常。可以用is_alive()方法判断线程是否活动。

其他线程可以调用某个线程的join()方法。这会阻塞当前上下文环境的线程,直到调用此方法的线程终止。

一个线程可以被标识为“守护线程”。当所有子线程为守护线程时,如果主线程结束,则所有子线程也就结束了。比较优雅的退出方法是引入event抛出异常。

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

group:必须是none,留待后续扩展应用。

target:被调用的函数对象

name:线程名,可默认不填,由系统自动创建

args:调用函数对象的传参,是一个元祖类型

kwargs:函数传参,是字典类型

如果子类重载了此构造函数,必须在对此线程操作之前,在子类中显式调用构造函数(thread.__init__())

start():每个线程中只能最多调用一次,否则会抛出运行错误。

run():在子类中重载此方法。

join([timeout]):等待直到线程终结。这会阻塞当前上下文环境的线程,直到调用此方法的线程终止或超时。

(因此当所有子线程结束后,主线程才会结束)

isAlive():返回该线程是否活动。

daemon:setDaemon()必须在线程启动start()之前调用,否则会抛出运行错误异常。

condition对象:一个condition对象通常和某种锁关联。condition变量拥有acquire()和release()方法,可调用相应的锁。还有wait()方法,notify()方法和notifyall()方法,但这三种方法必须在获取到锁之后进行,否则会抛出运行错误异常。

class threading.Condition([lock]) :如果参数lock给出,必须是Lock或RLock的对象。

acquire(*args):获取一个基础锁。

release() :释放锁

wait([timeout]) :等待,直到被通知或者超时。如果线程没有获取到锁,而调用了这个方法,则会抛出运行错误异常。

此消息会释放基础锁,然后阻塞直到因为在另一线程的同样的condition变量被notify或notifyAll()唤醒,一旦唤醒或超时,会重新获取锁并返回(好拗口,直白的意思就是“我累了,休息会儿,资源你们先拿去用”,然后要等待其他获取锁的线程,调用条件变量的notify或者nofityAll方法,才能把原有等待的线程唤醒继续执行)。

如果锁是一个可重入锁,并不能通过release方法被释放,原因是当它被锁了好多次的时候,这可能并没有真的解开锁。然而,一个可重入锁磊的内部接口被使用,这可以真的解开锁即便锁被获取了多次。

notify(n=1):默认情况下,唤醒一个等待的情况变量。

Event对象:这是最简单的线程间通信机制之一:一个线程释放一个event事件,而其他线程捕捉它。

一个event对象管理一个内部标识可以通过set()方法设为true,也可以通过clear()方法设为false。wait()方法会阻塞,直到该标识为True。默认是False

set():设置该标识为True。所有等待它为True的线程会被唤醒。调用wait()的线程,一旦该标识为True就不会再阻塞。

clear():设置该标识为false。相应地,调用wait的线程会阻塞,直到调用set方法把标识设为true

wait():当内部标识为true时阻塞。如果该内部标识一开始就是true,直接返回。否则,会阻塞知道其他线程调用se()把标识设为true,或者直到可选的超时发生。

python中的threading_python中的threading模块使用说明相关推荐

  1. Python多线程编程---(1)threading 模块 Thread 类

    全文参考:Python多线程编程(一):threading 模块 Thread 类的用法详解_frank 的专栏-CSDN博客 最近看了下团队自动化测试用例的代码,里面有涉及并行处理的逻辑,主要是基于 ...

  2. Python多线程编程(一):threading 模块 Thread 类的用法详解

    我们进行程序开发的时候,肯定避免不了要处理并发的情况. 一般并发的手段有采用多进程和多线程. 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况. Python 提 ...

  3. python中的threading_python中threading超线程用法实例分析

    本文实例讲述了python中threading超线程用法.分享给大家供大家参考.具体分析如下: threading基于Java的线程模型设计.锁(Lock)和条件变量(Condition)在Java中 ...

  4. python中的threading_Python中Threading用法详解

    Python的threading模块松散地基于Java的threading模块.但现在线程没有优先级,没有线程组,不能被销毁.停止.暂停.开始和打断. Java Thread类的静态方法,被移植成了模 ...

  5. python的多线程threading_Python中多线程thread与threading的实现方法,pythonthreading

    Python中多线程thread与threading的实现方法,pythonthreading 学过Python的人应该都知道,Python是支持多线程的,并且是native的线程.本文主要是通过th ...

  6. Python网络与并发编程 10 threading模块线程锁

    前言 本章节将继续围绕threading模块讲解,基本上是纯理论偏多. 对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题. 官方文档 线程安全 线程安 ...

  7. python创建多线程_Python 多线程,threading模块,创建子线程的两种方式示例

    本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式.分享给大家供大家参考,具体如下: GIL(全局解释器锁)是C语言版本的Python解释器中专有的,GIL的存在让多线程 ...

  8. 【Python】多线程及threading模块介绍

    ​目录 1. 多线程简单介绍 2. threading模块介绍 2.1 threading模块常用方法 2.2 Thread类使用 2.2.1 使用构造函数传递可调用对象的方法创建线程 2.2.2 继 ...

  9. python threading join_Python中threading模块join函数用法实例分析

    本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后joi ...

最新文章

  1. (LBS)基于地理位置的社交应用大战
  2. C++ Vector用法深入剖析
  3. c#读取Sybase中文乱码的解决办法
  4. 数据库中id类型和varchar类型的区别
  5. 如何在IDA软件中找到自己需要的目标函数(关键函数)
  6. CVPR 2018 TRACA:《Context-aware Deep Feature Compression for High-speed Visual Tracking》论文笔记
  7. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口 6...
  8. linux配置ip地址 suse_SUSE Linux下设置IP的两种方法
  9. MongoDB基本概念和常用操作(一)
  10. Python 学习笔记 (6)—— 读写文件
  11. 分享自己喜欢的无损高音质音乐给大家
  12. 联想android手机驱动,Lenovo联想手机驱动
  13. 机器人学笔记之——空间描述和变换:位置、姿态与坐标系
  14. 河南科技大学计算机学院录取名单,【计算机考研复试通知】2018年河南科技大学硕士研究生复试通知...
  15. iPhone、iPad尺寸
  16. 波士顿学院的计算机科学,波士顿学院介绍_专业_费用_排名_申请-托普仕美国院校库...
  17. docker入门小结
  18. salesforce之chatter
  19. 人工智能在减灾遥感中的应用
  20. MetLife - 美国大都会人寿保险公司

热门文章

  1. 数组元素的地址计算问题(一维到高维)
  2. 艾宾浩斯记忆表格excel_Excel全年学习复习计划表(艾宾浩斯遗忘曲线)
  3. Python 内置模块之 时间模块 time
  4. html浏览器的区别是什么意思,不同浏览器对css的识别有区别吗?
  5. 分别写出引入CSS的3种方式, 特点, 优先级
  6. Mongodb基本使用方法
  7. python 生成式,迭代器,生成器
  8. 深度相机(三)--三种方案对比
  9. Oracle PL/SQL块 多表查询(emp员工表、dept部门表、salgrade工资等级表)
  10. 文本分类的一种对抗训练方法