基本环境
python2.7
1 thread模块
调用thread模块中的start_new_thread()函数来产生新线程。
语法如下:
thread.start_new_thread ( function, args[, kwargs] )
参数说明:
function - 线程函数。
args - 传递给线程函数的参数,他必须是个tuple类型。
kwargs - 可选参数。
其中,如果在子线程执行完毕后没有time.sleep(3)操作,会出现以下错误:Unhandled exception in thread started by; sys.excepthook is missing;lost sys.stderr。原因是启动线程后,必须确保所有子线程返回结果后主线程才能退出;如果主线程比子线程早结束,无论子线程是否是后台线程,子线程都会被中断,抛出异常
2 threading模块的Thread类
Thread类提供了以下方法:
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。
使用threading模块创建多线程时,只需要继承threading.Thread类,并且重写run()方法即可。将类的对象调用start()方法即可启动线程。
执行结果中“Main thread exit”在for循环结束后立即执行,说明主线程生成子线程后,主线程会继续执行,而不会等待子线程结束。当需要等待子线程结束再执行主线程时,可以使用join()方法。
3 主线程对子线程的控制
Thread类的join()方法可以让主线程等待子线程的完成,join()方法有一个可选参数timeout:如果线程没有正常退出且超时的情况下,主线程就不再等待子线程。由于join()方法返回值为None,所以当join()方法带timeout参数时,join()返回后无法判断子线程是否已经结束,这是可以使用Thread类的isAlive()方法进行判断。
1)在超时参数不存在的情况下,join操作会一直处于阻塞状态
2)一个线程可以多次使用join()方法
3)不能在线程自己的运行代码中调用join(),否则会造成死锁
4)同一线程不能在start()之前调用join(),否则报错。
4 线程同步
4.1 锁机制
threading模块有Lock()方法可以生成锁。对临界区资源,在进入临界区部分加锁acquire(),离开临界区时释放锁release()。注意,锁只需生成一个,生成多个锁起不到临界区资源保护的作用。其中,生成锁时初始状态为未锁。
# -*- coding:utf-8 -*-
import threading, time
lock = threading.Lock()
sets = set()
class Counter:
def __init__(self):
self.value = 0
self.lock = lock
def increment(self):
time.sleep(2)
self.lock.acquire() #正确使用锁:仅生成一个锁
self.value += 1
value = se