🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 定时器(Timer) 定时器,指定n秒后执行某操作 ~~~ from threading import Timer def hello(): print("hello, world") t = Timer(1, hello) t.start() # after 1 seconds, "hello, world" will be printed ~~~ ## 条件(Condition) 使用Condition对象可以在某些事件触发或者达到特定的条件后才处理数据 * acquire()/release():获得/释放 Lock * wait([timeout]): 线程挂起,直到收到一个notify通知或者超时才会被唤醒继续运行。 wait()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。 调用wait()会释放Lock * notify(n=1): 通知其他线程(n是个数),那些挂起的线程接到这个通知之后会开始运行, notify()必须在已获得Lock前提下才能调用,否则会触发RuntimeError。 notify()不会主动释放Lock。 * notifyAll(): 通知所有线程(用得少) * 应用举例: 通过手动输入的方式控制并发线程的数量 ``` import threading def run(n): con.acquire() # 条件的acquire con.wait() # 等待 print("run the thread: %s" % n) con.release() if __name__ == '__main__': con = threading.Condition() # 实例化了一个条件 for i in range(10): # 10个线程 t = threading.Thread(target=run, args=(i,)) t.start() while True: inp = input('>>>') if inp == 'q':break con.acquire() con.notify(int(inp)) con.release() print('****') ``` ## 线程队列(queue) threading 线程模块中没有进程模块那样自带的Queue队列方法,但是可以从python自带的模块中导入. 有三种不同的用法队列 ### 先进先出队列 **class queue.Queue(maxsize=0) ** ~~~ import queue q=queue.Queue() q.put('first') q.put('second') q.put('third') print(q.get()) print(q.get()) print(q.get()) #结果(先进先出): first second third ~~~ ### 先进后出队列(堆栈) **class queue.LifoQueue(maxsize=0)** ~~~ import queue q=queue.LifoQueue() q.put('first') q.put('second') q.put('third') print(q.get()) print(q.get()) print(q.get()) #结果(后进先出): third second first ~~~ ### 优先级队列 **class queue.PriorityQueue(maxsize=0) #:存储数据时可设置优先级的队列** ~~~ import queue q=queue.PriorityQueue() #put进入一个元组,元组的第一个元素是优先级,数字越小优先级越高 q.put((20,'a')) q.put((10,'b')) q.put((30,'c')) print(q.get()) print(q.get()) print(q.get()) #结果(数字越小优先级越高,优先级高的优先出队): (10, 'b') (20, 'a') (30, 'c') ~~~