_thread – 底层多线程

该模块提供了操作多个线程(也被称为 轻量级进程 或 任务)的底层原语—-多个控制线程共享全局数据空间。


为了处理同步问题,也提供了简单的锁机制(也称为 互斥锁 或 二进制信号)。


当发生特定于线程的错误时,RuntimeError将引发异常。


使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import _thread
import time

def th_func(delay, id):
    while True:
    time.sleep(delay)
    print('Running thread %d' % id)

for i in range(2):
    _thread.start_new_thread(th_func, (i + 1, i))

方法

_thread.start_new_thread(function,args [,kwargs])

开启一个新线程并返回其标识。 线程执行函数 function 并附带参数列表 args (必须是元组)。 可选的 kwargs 参数指定一个关键字参数字典。


当函数返回时,线程会静默地退出。


当函数因某个未处理异常而终结时,sys.unraisablehook() 会被调用以处理异常。 钩子参数的 object 属性为 function。 在默认情况下,会打印堆栈回溯然后该线程将退出(但其他线程会继续运行)。


当函数引发 SystemExit 异常时,它会被静默地忽略。


_thread.exit()

抛出 SystemExit 异常。如果没有捕获的话,这个异常会使线程退出。


_thread.allocate_lock()

返回一个新的锁对象。锁中的方法在后面描述,初始情况下锁处于解锁状态。


_thread.get_ident()

返回当前线程的 “线程描述符”。它是一个非零的整型数。它的值没有什么含义,主要是作为 magic cookie 使用,比如作为含有线程相关数据的字典的索引。线程描述符可能会在线程退出,新线程创建时复用。


_thread.stack_size([size])

返回新建线程时使用的堆栈大小。可选参数 size 指定之后新建的线程的堆栈大小,而且一定要是0(根据平台或者默认配置)或者最小是4096(4KiB)的一个正整数。


4KiB是当前最小的能保证解释器足够堆栈空间的堆栈大小。


对象

_thread.LockType

锁对象的类型。


锁类

class Lock

Python提供的线程模块包含一个易于实现的锁定机制,可实现线程之间的同步。通过调用Lock()方法创建一个新的锁。 新的锁定对象获取(阻止)方法用于强制线程同步运行。可选的阻塞参数使您可以控制线程是否正在等待获取锁。


方法

锁对象具有以下方法:

lock.acquire(waitflag = 1,timeout = -1)

没有任何可选参数时,该方法无条件申请获得锁,有必要的话会等待其他线程释放锁(同时只有一个线程能获得锁 —— 这正是锁存在的原因)。


如果传入了整型参数 waitflag,具体的行为取决于传入的值:如果是 0 的话,只会在能够立刻获取到锁时才获取,不会等待,如果是非零的话,会像之前提到的一样,无条件获取锁。


如果传入正浮点数参数 timeout,相当于指定了返回之前等待得最大秒数。如果传入负的 timeout,相当于无限期等待。如果 waitflag 是 0 的话,不能指定 timeout。


如果成功获取到所会返回 True,否则返回 False。


lock.release()

释放锁。锁必须已经被获取过,但不一定是同一个线程获取的。


lock.locked()

返回锁的状态:如果已被某个线程获取,返回 True,否则返回 False。


除了这些方法之外,锁对象也可以通过 with 语句使用,例如: .. code-block:

:linenos:

 import _thread

 a_lock = _thread.allocate_lock()
 with a_lock:
    print("a_lock is locked while this executes")