Python线程指南(中)

2. thread

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

01 # encoding: UTF-8
02 import thread
03 import time
04  
05 # 一个用于在线程中执行的函数
06 def func():
07     for in range(5):
08         print 'func'
09         time.sleep(1)
10     
11     # 结束当前线程
12     # 这个方法与thread.exit_thread()等价
13     thread.exit() # 当func返回时,线程同样会结束
14         
15 # 启动一个线程,线程立即开始运行
16 # 这个方法与thread.start_new_thread()等价
17 # 第一个参数是方法,第二个参数是方法的参数
18 thread.start_new(func, ()) # 方法没有参数时需要传入空tuple
19  
20 # 创建一个锁(LockType,不能直接实例化)
21 # 这个方法与thread.allocate_lock()等价
22 lock = thread.allocate()
23  
24 # 判断锁是锁定状态还是释放状态
25 print lock.locked()
26  
27 # 锁通常用于控制对共享资源的访问
28 count = 
29  
30 # 获得锁,成功获得锁定后返回True
31 # 可选的timeout参数不填时将一直阻塞直到获得锁定
32 # 否则超时后将返回False
33 if lock.acquire():
34     count += 1
35     
36     # 释放锁
37     lock.release()
38  
39 # thread模块提供的线程都将在主线程结束后同时结束
40 time.sleep(6)

thread 模块提供的其他方法: 
thread.interrupt_main(): 在其他线程中终止主线程。 
thread.get_ident(): 获得一个代表当前线程的魔法数字,常用于从一个字典中获得线程相关的数据。这个数字本身没有任何含义,并且当线程结束后会被新线程复用。

thread还提供了一个ThreadLocal类用于管理线程相关的数据,名为 thread._local,threading中引用了这个类。

由于thread提供的线程功能不多,无法在主线程结束后继续运行,不提供条件变量等等原因,一般不使用thread模块,这里就不多介绍了。

3. threading

threading基于Java的线程模型设计。锁(Lock)和条件变量(Condition)在Java中是对象的基本行为(每一个对象都自带了锁和条件变量),而在Python中则是独立的对象。Python Thread提供了Java Thread的行为的子集;没有优先级、线程组,线程也不能被停止、暂停、恢复、中断。Java Thread中的部分被Python实现了的静态方法在threading中以模块方法的形式提供。

threading 模块提供的常用方法: 
threading.currentThread(): 返回当前的线程变量。 
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

threading模块提供的类:  
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local.

3.1. Thread

Thread是线程类,与Java类似,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():

01 # encoding: UTF-8
02 import threading
03  
04 # 方法1:将要执行的方法作为参数传给Thread的构造方法
05 def func():
06     print 'func() passed to Thread'
07  
08 = threading.Thread(target=func)
09 t.start()
10  
11 # 方法2:从Thread继承,并重写run()
12 class MyThread(threading.Thread):
13     def run(self):
14         print 'MyThread extended from Thread'
15  
16 = MyThread()
17 t.start()

构造方法: 
Thread(group=None, target=None, name=None, args=(), kwargs={}) 
group: 线程组,目前还没有实现,库引用中提示必须是None; 
target: 要执行的方法; 
name: 线程名; 
args/kwargs: 要传入方法的参数。

实例方法: 
isAlive(): 返回线程是否在运行。正在运行指启动后、终止前。 
get/setName(name): 获取/设置线程名。 
is/setDaemon(bool): 获取/设置是否守护线程。初始值从创建该线程的线程继承。当没有非守护线程仍在运行时,程序将终止。 
start(): 启动线程。 
join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。

一个使用join()的例子:

01 # encoding: UTF-8
02 import threading
03 import time
04  
05 def context(tJoin):
06     print 'in threadContext.'
07     tJoin.start()
08     
09     # 将阻塞tContext直到threadJoin终止。
10     tJoin.join()
11     
12     # tJoin终止后继续执行。
13     print 'out threadContext.'
14  
15 def join():
16     print 'in threadJoin.'
17     time.sleep(1)
18     print 'out threadJoin.'
19  
20 tJoin = threading.Thread(target=join)
21 tContext = threading.Thread(target=context, args=(tJoin,))
22  
23 tContext.start()

运行结果:

in threadContext. 
in threadJoin. 
out threadJoin. 
out threadContext.

你可能感兴趣的:(Python线程指南(中))