Python3并发编程之threading模块

文章目录

  • 创建线程对象——threading.Thread()
  • 创建Thread对象的两种方法
  • Thread()类实例化对象的方法
  • 创建锁对象
    1、threading.Lock()
    2、threading.RLock()
  • 创建信号量对象——threading.semaphore()
  • 创建条件对象——threading.Condition()
  • 创建事件对象——threading.Event()

创建线程对象——threading.Thread()

参数:

参数 描述
group=None 该类中的待扩展参数。
target = None 目标函数,即被开辟线程的执行任务。默认值为None,表示什么都不执行。
name=None 该线程的名称。在默认情况下,线程的唯一名称以“ Thread- N ” 的形式构造,其中N是一个十进制数字。
args=() 值是一个元组,包含目标函数的所需参数。
kwargs={} 值是一个字典,包含目标函数所需参数。
daemon=None 参数值True、False决定了该线程是否为守护线程(后台线程)。若使用默认值None,该参数会从当前线程执行。

创建线程对象的两种方法

1、 threading.Thread()类实现。
2 、 继承threading.Thread()类,并重写父类的__init__以及run()方法。

import threading

class MyThread(threading.Thread):
    def __init__(self,name):
   		#	向父类传递参数。
        super().__init__(name=name)
    def run(self):
    	#	打印执行线程的名称。
        thread_name = threading.current_thread().name
        print(thread_name)

if __name__ == '__main__':
    threads = [MyThread('线程%d'%(order,)) for order in range(6)]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()

执行结果

线程0
线程1
线程2
线程3
线程4
线程5

注:
创建新线程需要调用start()方法,该方法又会调用该对象的run()方法。与直接调用run()方法不同的是,调用start()方法会创建一个新的线程,而run()不能。

Thread()类实例化对象的方法及属性

描述对象 方法
start() 启动线程。
join(timeout=None) 阻塞调用线程。直到调用对象完成其任务或触发超时。
is_alive() 返回线程的活动状态,返回值类型为布尔类型。
isDaemon() 返回线程是否为守护线程的判断结果,返回值类型为布尔型。
setDaemon() 设置Daemon的值。
getName() 获取线程名称。
setName() 设置线程名称。
name 线程名称。
ident 线程ID。
daemon 指定该线程是否为守护线程(守护线程),值的选择及其影响参见第一部分(创建线程对象——threading.Thread()类)。

threading的锁对象

1、threading.Lock()
创建一个锁对象,任何线程都可以获得该锁或释放锁。最先到达的线程获得锁后,其他线程执行到该锁时将被阻塞,直到该锁被其他线程释放。
Lock对象的方法:

方法 描述
acquire(blocking=True,timeout=-1) 当blocking的值为True时,只允许一个线程执行与Lock锁相关联区域。如果将timeout设置为非负数,则最多阻塞timeout秒;当blocking的值为False时,与线程无锁无异。
release() 释放锁。如果在没有线程拥有该锁时执行将引发RuntimeError错误。
locked() 在锁被某一线程拥有时,返回True;反之返回False。

2、threading.RLock()
RLock全称为ReentrantLock,即可重入锁也称递归锁。该锁有三个特点:

1、谁拿到锁,谁能释放。
2、同一线程可以多次拿到该锁。
3、acquire多少次就必须release多少次,并且只有最后一次release才能改变锁的状态。

RLock对象的方法:

方法 描述
acquire(blocking=True,timeout=-1) 当blocking的值为True时,只允许一个线程执行与RLock锁相关联区域。如果将timeout设置为非负数,则最多阻塞timeout秒;当blocking的值为False时,与线程无锁无异。
release() 释放锁。如果在没有线程拥有该锁时执行将引发RuntimeError错误。

创建信号量对象——threading.Semaphore()

信号量是由一个内部变量构成的,它标识出了对该锁关联资源的并发访问量。
该类只有一个参数value,默认值为一,它指定了信号量的初始值。如果该参数值小于零,将引发ValueError错误。
Semaphore对象的方法

方法 描述
acquire(blocking=True,timeout=None) 与Lock和RLock对象的相同方法不同的是,调用该方法会使信号量减一。
release() 与Lock和RLock对象的相同方法不同的是,调用该方法会使信号量加一。

创建条件对象——threading.Codition()

该类的实例化对象具有创建锁的能力。某一个线程在在获得锁后可以调用Codition.wait()实现对该线程的阻塞,直到接受到其他线程的唤醒指令。
Codition()类具有参数lock,指定实例化对象能够使用哪一种锁,值是一个Lock或RLock的锁对象。
Codition对象的方法

方法 描述
acquire() 获取锁。其参数与Lock或RLock的实例化对象的相同方法的参数一致。
release() 释放锁。
wait(timeout=None) 该线程被挂起,直到接受到一个notify通知或触发超时才能够被唤醒。
notify(n=1) 唤醒其他线程,最多唤醒n个等待进程。notify()必须在已获得Lock前提下才能调用,否则会触发RuntimeError错误。
notifyAll() 唤醒所有等待进程。

创建事件对象——threading.Event()

事件对象内部具有一个标志,可以通过set()方法将其设置值为True,也可以通过clear()方法将其设置为初始值,即False。Event.wait()方法会阻塞线程,直到标志变为True为止。
Event对象的方法

方法 描述
set() 将内部标志变为True。
is_set() 返回内部标志的值 。
isSet() 同is_set()。
clear() 将内部标志重置为False。
wait(timeout=None) 阻塞调用线程,直到内部标志为True,或触发超时。

你可能感兴趣的:(Python3并发编程)