本文实例讲述了Python多线程原理与用法。分享给大家供大家参考,具体如下:
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。
创建并启动一个线程
import threadingdef runtask(name): print("%s线程已启动"%name)t = threading.Thread(target=runtask,args=("task1",)) # args因为是一个元组,所以必须这样写,否则运行将报错t.start()
join
等待当前线程执行完毕
import threadingimport timedef runtask(name): print("%s线程已启动"%name) time.sleep(2)t = threading.Thread(target=runtask,args=("task1",))t.start()t.join()print("abc") # 过了2s才会打印,若无等待将看不到等待2s的效果
setDaemon(True)
将线程设置为守护线程。若设置为守护线程,主线程结束后,子线程也将结束,并且主线程不会理会子线程是否结束,主线程不会等待子线程结束完后才结束。若没有设置为守护线程,主线程会等待子线程结束后才会结束。
active_count
程序的线程数量,数量=主线程+子线程数量
Lock(互斥锁)
Python编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。在Python中我们使用threading模块提供的Lock类。
import threading,timedef runtask(name): global count time.sleep(1) lock.acquire() # 获取锁资源,并返回是否获取成功 count+=1 print(name,count) lock.release() # 释放资源count = 0lock = threading.Lock() # 互斥锁for index in range(50): t = threading.Thread(target=runtask,args=("thread%d"%index,)) t.start()
上面这段代码如果没有加上互斥锁,在Python2.x中执行的结果将会是乱的。在Python3.x中执行却总是正确的,似乎是自动为其加了锁
RLock(递归锁,可重入锁)
当一个线程中遇到锁嵌套情况该怎么办,又会遇到什么情况?
def run1(): global count1 lock.acquire() count1 += 1 lock.release() return count1def run2(): global count2 lock.acquire() count2 += 1 lock.release() return count2def runtask(): lock.acquire() r1 = run1() print("="*30) r2 = run2() lock.release() print(r1,r2)count1,count2 = 0,0lock = threading.Lock()for index in range(50): t = threading.Thread(target=runtask,) t.start()
新闻热点
疑难解答