Python库中的“ _thread”模块提供了一个低级接口,用于处理具有多个线程共享全局数据空间的轻量级进程。为了进行同步,在此模块中定义了简单的锁(也称为互斥锁或二进制信号量)。内置的“线程”模块提供了在此模块之上构建的更高级别的线程API。
此模块级函数用于在当前进程中打开新线程。该函数将函数对象作为参数。成功创建新线程时将调用此函数。该函数的跨度对应于线程的寿命。可以通过调用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