原标题:python常用标准库threading多线程(广州中软卓越)

threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。

1、线程应用的第一种模式thread模块是比较底层的模块

import thread:引用对应的模块包。

thread.start_new_thread(defName,())创建开启一个新的线程;第一个参数为新线程要执行的方法,第二个参数为元组传递执行方法对应需要参数;注:python元组为一个时需要(元素,)一个元素加一个','进行表示。

thread.exit_thread():主线程调用该方法表示所有的线程结束操作;子线程通过调用exit.thread()的方法来表示实现当前子线程的结束操作。

thread.join():python的Thread类中还提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行。这个方法还可以设定一个timeout参数,避免无休止的等待。因为两个线程顺序完成,看起来象一个线程,所以称为线程的合并

thread.setDaemon(True):默认情况主线程退出时会等待子线程的结束,如果希望主线程不等待子线程,可以设置子线程为后台线程,主线程退出,子线程随即结束。

2、线程应用的第二种模式threading模块是对thread模块进行了一定的封装,可以更方便我们的使用。

import threading:引用对应的模块包。

myThread=threading.Thread(target=defName,args=('Alice',))创建一个线程,target赋值要执行线程的方法,args复制执行方法需要的参数信息。

myThread.start():线程开始执行。

num=len(threading.enumerate):查看当前执行的线程的数量。

3、线程的应用的第三种方式创建一个线程类,继承基类threading.Thead;重写基类的def run(self):方法,将该线程要执行的程序写在该方法中。

class MyThread(threading.Thread):创建一个线程类

进行基类构造函数的创建操作

def __init__(self,name,time):

threading.Thread.__init__(self,name='可以为线程的名字进行复制')

myThread=MyThread():线程对象的创建。

myThread.start():该线程执行。

4、threading模块中定义了Lock()类,可以方便的处理锁定。

mutex=threading.Lock():互斥锁对象的创建。

if mutex.acquire([blocking]):进行锁定,锁定成功后返回true;锁定方法acquire()可以有一个blocking参数。如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为止(如果没有指定,那么默认为True);如果设定blocking为False,则当前线程不会堵塞。

mutex.release():执行完程序内容后进行锁的释放操作。

5、支持同一线程多次请求同一资源,python提供了可重入锁。RLock对象中,同时维护着一个Lock和一个counter变量;counter变量存储acquire的次数,从而使得资源可以多次被acquire;直到一个线程中的所有的acquire被release,其他的线程才可以获得资源

mutex=threading.RLock():创建可重入锁对象。

mutex.acquire():进行上锁。

mutex.release():进行释放。

6、python提供的Condition对象提供了对复杂线程同步问题的支持;Condition被称为条件变量;Condition维护着一个锁和一个waiting池。

con=threading.Condition():创建条件变量对象;可以接受一个Lock/RLock对象作为参数,如果没有指定则内部默认创建一个RLock

con.acquire():进行加锁。

con.wait():线程会释放Condition内部的锁并进入blocked(堵塞)状态,同时在waiting池中记录这个线程。

con.notify():Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

con.notifyAll():Condition对象通知waiting池中所有的线程,尝试acquire内部锁。作用防止有的线程永远处于沉默状态。

con.release():进行释放。

threading.Event可以是一个线程等待其他线程的通知。其内置了一个标志,初始值为False。线程通过wait()方法进入等待状态,直到另一个线程调度set()方法将内置标志设置为True是,Event通知所有等待状态的线程回复运行。还可以用isSet()方法查询Event对象内置状态的当前值。

event=threading.Event():进行对应Envent对象的创建。

def __init__(self,threadName,event):

self.threadEvent=event :重构对应threading.Thread基类中__init__的方法。

self.threadEvent.wait():使线程进入等待状态。

event.set():启动waiting池中等待的线程。