Python--threading

作用:
  • 建立在thread模块之上,可以更容易的管理多个执行线程
  • 通过使用线程,程序可以在同一个进程空间并发地运行多个操作。
  • Thread对象在同一个进程中并发地运行,并共享内存。对于I/O受限而不是CPU受限的任务来说,使用线程是实现这种任务缩放的一种简单方法。multiprocess模块时threading的镜像,只是并不是提供Thread类,而是提供一个Process,每个Process是无共享内存的真正的系统进程,不过multiprocess提供了一些特性,可以共享数据并在进程间传递消息
python版本:
  • 1.5.2及以后版本
函数定义:
  • t = threading.Thread(name, target):线程的构造函数,t为Thread对象实例,可选参数为,name、target(线程运行的主体方法)
  • t.setDaemon():设置子线程为守护线程,因此在主线程退出时,子线程会继续执行;否则,主线程会等待子线程结束后再退出
  • t.start():将线程由诞生状态(born)更新为就绪状态(ready或runnable)
  • t.join(timeout):等待调用join方法的线程实例结束;join()方法同样可以用来等待守护线程;timeout为超时时间(秒),可选参数
  • threading.currentThread().getName():获得当前线程的名字
  • threading.enumerate():返回当前环境下活动的线程的枚举列表(Thread类型),包括当前线程
  • 线程的状态转化图:
    • 新建:通过构造函数初始化的线程处于新建状态
    • 就绪:通过调用start()方法后,线程就处于ready或者runnable状态
    • 运行:处于ready状态的线程被CPU调度并运行,于是线程的状态转换为running
    • 阻塞:由于等待I/O事件,或者等待特定事件发生,线程进入阻塞状态
    • 死亡:线程正常结束、非正常中断等都会让线程进入dead状态
  • timer = threading.Timer(time, target):返回定时器线程(Timer对象实例),线程在指定时间time秒后启动线程
  • timer.cancel() #取消定时器线程,如果定时器线程还没有开始,那么该线程将永远都不会执行
  • event = threading.Event():返回事件对象(Event),用于线程之间传递消息
  • event.set():设置信号
  • event.clear():清除信号
  • event.isSet():非阻塞式判断信号是否设置
  • event.wait(timeout):阻塞式等待信号设置;timeout为等待超时,可选参数
  • lock = threading.Lock() :返回锁对象Lock
  • lock.acquire(blocking) #尝试加锁;可选参数blocking(True、False)标识是否阻塞获取锁,即一直等待
  • lock.release() #释放锁
  • lock = threading.RLock():返回再入锁(RLock),允许不同代码同时持有该锁
  • condition = threading.Condition() :返回条件对象(Condition)
  • condition.acquire():获取条件对象,阻塞式
  • condition.release():释放条件对象
  • condition.wait():等待条件设置
  • condition.notifyAll():通知所有等待该条件的线程
  • semaphore = threading.Semaphore(num) :返回信号量对象(Semaphore),参数num表示同时允许多少个线程访问该信号量
  • semaphore.acqure():获得信号量,阻塞式
  • semaphore.release():释放信号量
应用实例:
  • 限制资源的并发访问
    • 使用Semaphore来管理资源的并发访问量
  • 同步线程
    • 除了使用Event,还可以使用Condition对象来同步线程。由于Condition使用了一个Lock,它可以绑定到一个共享资源,允许多个线程等待资源更新。
    • 可以使用with来管理Condition对象,从而不用显示的获得和释放Condition对象
  • 控制资源访问
    • 使用python的内置数据结构(列表、字典等)是线程安全的,这是因为python使用原子字节码来管理这些数据结构(更新过程中不会释放GIL);python中使用的其它数据结构或者简单类型则不是线程安全的,需要使用Lock对象来进行并发访问控制
    • 可以使用with来管理锁资源,这样就不用显示获得和释放锁
  • 派生线程
    • 通过继承threading.Thread实现派生线程的目的,需要覆盖run()方法来完成所需的工作;run()方法在Thread对象调用了start()方法后开始执行,无需显示调用run()方法
    1. import threading
    2. class MyThreadWithArgs(threading.Thread):
    3.     def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None):
    4.         threading.Thread.__init__(self, group=group, target=target, name=name, verbose=verbose)
    5.         self.args = args
    6.         self.kwargs = kwargs
  • 线程特定数据
    • 线程特定数据会受到保护,只有创建改数据的线程具有访问该数据的权限,对其它线程是隐藏的
    • 使用threading.local()创建线程特定数据集合对象(local),可以往该对象中添加任何数据
    • 其实local对象对所有线程是可见的,但是local中绑定的数据对设置它的其它线程是隐藏的
  • 线程日志输出:
    • import logging
    • import threading
    • logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-10s) %(message)s',)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值