线程基础:http://blog.chinaunix.net/uid-26275986-id-3144019.html
用户模式下的线程同步:http://blog.chinaunix.net/uid-26275986-id-3152738.html
下面我们直接给出关于Python中使用线程的例子,让大家可以对线程编程有个初步的了解。
一、线程创建
点击(此处)折叠或打开
-
#This is a test for Threading...
-
import threading
-
import time
-
-
def Clock_1(interval):
-
print 'SubThread is going to work...'
-
for i in range(5):
-
print 'Clock_1: The SYS Time is ', time.ctime()
-
time.sleep(interval)
-
print 'SubThread is done...'
-
if __name__ == '__main__':
-
t = threading.Thread(target=Clock_1, args=(3,))
-
t.daemon = True
-
t.start()
-
print t.name, ' has started...'
-
#t.join()
-
print 'Main Thread will Exit...'
- raw_input('Enter for Exit...')
-1. 第2-3行导入了threading和time模块;
-2. 第5-10行定义了我们的线程函数,主要由新的线程来运行;
-3. 第11行依旧是CMD命令下的功能语句;
-4. 第12行是创建线程的语句,利用threading.Thread()类的构造方法来创建,和Process()一样,不用管其他参数,我们只需要初始化target=Clock_1以及args参数元祖就可以了,返回新线程实例;
-5. t.daemon用来设定该线程是否是后台线程,若为True时则为后台线程,前台线程和后台线程的区别是当主线程退出时子线程是否同步销毁,但是自己在测试的时候,却发现二者结果都是一样的
-6. 第14行是启动该线程的方法,该方法会调用t.run()方法运行target参数指定的函数;
-7. 第16行用于告知主线程等待子线程结束后再结束;

第一个是没有注释t.daemon=True的运行结果,第二个是注释以后的,可以发现在主线程结束之后,子线程继续运行,所以可以推测进程没有结束,主线程结束之后继续执行子线程。但是也可以看出其中出现了错误,开始的输出信息显示了错乱。我们试着启用t.join()语句,即让主线程等待子线程运行结束再结束:

可以看出此时主线程没有退出,一直等待子线程结束才退出;
二、同步锁
线程中一个重要的问题就是资源竞争,为了保证多线程能够协调一致地工作,我们有同步锁、信号量以及事件等多种机制,今天这里只介绍同步锁,其他的机制资料很容易查到,而且只是同一种功能的不同实现,各有利弊。
点击(此处)折叠或打开
-
#This is a test for Threading...
-
import threading
-
import time
-
-
def Clock_1(interval):
-
lock.acquire()
-
print 'SubThread is going to work...'
-
for i in range(5):
-
print 'Clock_1: The SYS Time is ', time.ctime()
-
time.sleep(interval)
-
lock.release()
-
print 'SubThread is done...'
-
if __name__ == '__main__':
-
lock = threading.Lock()
-
t = threading.Thread(target=Clock_1, args=(3,))
-
lock.acquire()
-
#t.daemon = True
-
t.start()
-
print t.name, ' has started...'
-
lock.release()
-
t.join()
-
print 'Main Thread will Exit...'
- raw_input('Enter for Exit...')
-1. lock = threading.Lock()用于初始化一个锁对象;
-2. lock.acquire()用于请求一个锁,如果该锁为空闲,则申请成功,代码继续执行,反之则暂停等待;
-3. lock.release()用于释放一个占用的锁,将其标识为空闲状态;
就是这么简单,我们看看代码执行的结果,上面部分是原先代码执行的结果,下面代码是加入同步锁之后的运行结果:

通过比较,我们还是可以看到同步锁规范了线程之间的工作。