大学生网站建设报告,网站用什么技术实现,discuz 轉wordpress,对Wordpress系统的感想这段时间使用python做串口的底层库#xff0c;用到了多线程#xff0c;对这部分做一下总结。实际用完了后再回过头去看python的官方帮助文档#xff0c;感觉受益匪浅#xff0c;把里面的自己觉得有用的一些关键点翻译出来#xff0c;留待后续查验。
threading是thread的高…这段时间使用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:
testLockthreading.Lock()
testLock.acquire()#对锁的使用也可以不用acquire()和release直接使用with testLock:即可
self._testTrue
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(groupNone, targetNone, nameNone, args(), kwargs{})
group:必须是none留待后续扩展应用。
target被调用的函数对象
name线程名可默认不填由系统自动创建
args调用函数对象的传参是一个元祖类型
kwargs函数传参是字典类型
如果子类重载了此构造函数必须在对此线程操作之前在子类中显式调用构造函数thread.__init__()
start:每个线程中只能最多调用一次否则会抛出运行错误。
run()在子类中重载此方法。
join([timeout]):等待直到线程终结。这会阻塞当前上下文环境的线程直到调用此方法的线程终止或超时。
因此当所有子线程结束后主线程才会结束
isAlive()返回该线程是否活动。
daemonsetDaemon必须在线程启动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(n1)默认情况下唤醒一个等待的情况变量。
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或者直到可选的超时发生。