这段时间使用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模块使用说明的更多相关文章

  1. Python多线程(threading模块)

    线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...

  2. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  3. Python中的threading

    Python中的threading RLock--重入锁 RLock在Python中的实现是对Lock的封装,具体在类中维护了一个重入次数的变量.一旦一个线程获得一个RLock,该线程再次要求获得该锁 ...

  4. Python中的random模块,来自于Capricorn的实验室

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  5. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  6. Python中的random模块

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  7. 浅析Python中的struct模块

    最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查阅了相关资料大概了解了,在这里做一下简单的总结. 了解c语言 ...

  8. python中的StringIO模块

    python中的StringIO模块 标签:python StringIO 此模块主要用于在内存缓冲区中读写数据.模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分 ...

  9. python中的select模块

    介绍: Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqu ...

随机推荐

  1. Maven导入依赖慢解决办法

    新安装的Maven,下载jar包速度会很慢,因为官方的库在国外, 连上并下载速度很慢. 因为maven是支持镜像的,我们就可以本地maven目录下的的conf目录下的setting.xml文件中找到标 ...

  2. SHA256sum系列命令检测文件完整性

    1 sha256sum sha256sum是一个检测文件完整性的命令,一般下载的文件都会附带一个哈希值,使用sha256sum计算下载文件的哈希值再与目标哈希值比较即可确定文件是否完整,类似的命令还有 ...

  3. Horovod-Usage

    Usage 代码中要包含以下6步: 初始化 Run hvd.init() to initialize Horovod. 将每个GPU固定到单个进程以避免资源争用. 一个线程一个GPU,设置到 loca ...

  4. 一起来看Java设计思想之23种设计模式

    目录 怎么使用设计模式 23种设计模式 创建型模式 结构型模式 行为型模式 总结 怎么使用设计模式 为什么要使用设计模式? 编写代码,写接口.写类.写方法 用设计模式做设计的作用是什么? 指导.规定如 ...

  5. 指方画圆之Java设计模式:适配器模式

    目录 应用场景 适配器模式 定义 意图 主要解决问题 何时使用 优缺点 指鹿为马VS指方为圆 指鹿为马 指方为圆 应用场景 使用者依赖的接口与提供者的接口不匹配时,就加一层适配,而不修改两端的代码 生 ...

  6. Git分支及其协同开发

    目录 Git分支 Git是如何保存数据的 Git分支的本质 Git分支的操作 远程仓库与本地仓库分支开发 一个项目多个远程仓库 远程仓库操作命令 协同开发 Git flow工作流 GitLub安装搭建 ...

  7. logstash收集springboot日志

    logstash收集springboot日志 maven依赖 <dependency> <groupId>net.logstash.logback</groupId> ...

  8. 微信小程序底部实现自定义动态Tabbar

    多图警告!!! 最近在工作中遇到这样一个需求:微信小程序底部的Tab需要通过判断登录人的角色动态进行改变,想要实现这个功能依靠小程序原生的Tabbar是不可能实现的了,所以研究了一下自定义Tab,这里 ...

  9. 【Idea】实用插件列表

    1.Translation : 翻译 2.CodeGlance:代码预览 3.Lombok:优雅编程插件 4.GenerateSerialVersionUID :自动生成序列化ID 5.CamelCa ...

  10. 逆向 time.h 函数库 time、gmtime 函数

    0x01 time 函数 函数原型:time_t time(time_t *t) 函数功能:返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位.如果 se ...