_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是当前最小的能保证解释器足够堆栈空间的堆栈大小。
方法¶
锁对象具有以下方法:
-
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")