Python低级线程API

Python库中的“ _thread”模块提供了一个低级接口,用于处理具有多个线程共享全局数据空间的轻量级进程。为了进行同步,在此模块中定义了简单的锁(也称为互斥锁或二进制信号量)。内置的“线程”模块提供了在此模块之上构建的更高级别的线程API。

start_new_thread()

此模块级函数用于在当前进程中打开新线程。该函数将函数对象作为参数。成功创建新线程时将调用此函数。该函数的跨度对应于线程的寿命。可以通过调用sleep()函数来阻止线程。

以下代码是使用_thread模块的线程机制的简单示例。

import _thread
import time

def run( threadName):
   count = 0
   for i in range(1,6):
      time.sleep(5)
      print ( threadName, i )

_thread.start_new_thread( run, ("child", ) )

for i in range(1,6):
   print ( 'main', i )
   time.sleep(5)

start_new_thread()函数产生一个新线程,该线程并行调用run函数。run()函数以及程序的主线程中都有一个循环。sleep()对这两个函数的调用导致执行重叠,如下所示:-

main 1
child 1
main 2
child 2
main 3
child 3
main 4
child 4
main 5
child 5

线程间同步是通过使用Lock对象实现的。allocate_lock()函数返回锁对象。可以使用以下方法

获得()

此方法无条件地获取锁,直到另一个线程将其释放为止。一次只有一个线程可以获取锁。如果成功获取了锁,则返回值为True,否则为False。

释放()

此方法释放锁定。该锁必须是较早获得的,但不一定是由同一线程获得的。

在下面的示例中,声明了两个线程。每个都run()同时调用函数。其中一个获取锁并继续进入“同步”功能,而其他等待。

import _thread
import time

def run( threadName):
   lock.acquire()
   synchronized(threadName)
   lock.release()

def synchronized(threadName):
   print (threadName,"has acquired lock")
   counter = 10
   while counter:
      time.sleep(1)
      print ('*', end='')
      counter = counter-1
      print('\n{} has released lock'.format( threadName))

lock = _thread.allocate_lock()

_thread.start_new_thread( run, ("t1", ) )
_thread.start_new_thread( run, ("t2", ) )

输出结果

>>> t1 has acquired lock
**********
t1 has released lock
t2 has acquired lock
**********
t2 has released lock