Python底层线程API


Python库中的`_thread`模块提供了一个低级接口,用于处理共享全局数据空间的轻量级进程的多线程。为了同步,此模块中定义了简单的锁(也称为互斥锁或二元信号量)。内置的`threading`模块在此模块之上构建了一个更高级别的线程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()函数返回锁对象。它有以下方法:

acquire()

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

release()

此方法释放锁。锁必须先前已被获取,但不一定是由同一个线程获取的。

在下面的示例中,声明了两个线程。每个线程并发地调用run()函数。其中一个线程获取锁并继续进入“synchronized”函数,而另一个线程等待。

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

更新于:2019年7月30日

515 次浏览

启动您的职业生涯

完成课程后获得认证

开始学习
广告