这段时间使用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. CODING 首届金融科技技术交流闭门会议顺利召开

    近期,由腾讯云旗下一站式 DevOps 开发平台 CODING 和中国 DevOps 社区主办的深圳第十一届 Meetup 圆满结束,会上三位专家分享了自己独到的行业见解,腾讯云 CODING Dev ...

  2. Leedcode算法专题训练(位运算)

    https://www.cnblogs.com/findbetterme/p/10787118.html 看这个就完事了 1. 统计两个数的二进制表示有多少位不同 461. Hamming Dista ...

  3. Gson?So easy.

    1.概述 这篇文章主要讲述了Gson的使用.包括从最基础的基本类型的序列化,到对象,数组,集合,再到Gson注解,Gson Builder,再到格式化,自定义序列化与反序列化等内容. 另外文章篇幅较长 ...

  4. 9. resultMap 结果映射集

    @Data public class CreditCard extends BankCard { /** * 消费额度 */ private String creditLine; } @Data pu ...

  5. 12- APP接口测试以及接口文档的分析

    什么是接口? 为什么要做接口测试? 接口测试流程 需求评审 需求分析 接口用例设计 执行测试用例 bug的定位于追踪 接口文档分析 接口文档分析:开发 内容: 1.接口名称 2.接口地址 3.支持方式 ...

  6. 数据库函数-常用的MySQL函数

    1.date_sub() 时间的加减 备注:record 为datetime类型 select record_time as date, order_area as orderArea, order_ ...

  7. 病毒木马查杀实战第017篇:U盘病毒之专杀工具的编写

    前言 经过前几次的讨论,我们对于这次的U盘病毒已经有了一定的了解,那么这次我们就依据病毒的行为特征,来编写针对于这次U盘病毒的专杀工具. 专杀工具功能说明 因为这次是一个U盘病毒,所以我打算把这次的专 ...

  8. POJ3692 最大点权独立集元素个数

    题意:      n个男孩和m个女孩,给你他们谁和谁彼此了解,问你要找到一个集合,使得这个集合中的男孩和女孩相互了解,并且人数最多. 思路:      简单题目,其实就是在求最大点权独立集元素个数,先 ...

  9. Windows下Nexus 5 改user模式为debug模式

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52337241 在学习Android软件安全的过程中,经常要用到Android的动态调试 ...

  10. MetInfo Password Reset Poisoning By Host Header Attack

    if we know some user's email, the we will can reset the user's email by host header attack. The atta ...