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
广告