您的位置:首页 > 编程语言 > Python开发

python中的线程使用--threading模块

2012-03-07 16:59 591 查看
最近又用到了python中的多线程编程,前段时间使用并学习过,但是由于长时间不用,慢慢就忘记怎么用了,毕竟对线程的使用还不是很熟练,现在总结一下,记录下来,加深一下学习的印象。
python中关于线程,主要有两个模块thread和threading,其中thread的模块已不建议使用,因为threading模块更高级,管理线程的功能更强,对线程支持也更强,比如线程同步原语较多,而thread模块的线程同步原语只有一个Lock锁。下面还是对这两种模块分别进行介绍:
1.thread模块
thread模块提供了基本的线程同步锁对象(lock object,也叫原语锁,简单锁,互斥锁,互斥量,二值信号量),模块中常用函数如下:
1.start_new_thread(functon,args, kwargs=None) 产生一个新的线程,在新线程中用指定的参数和可选的kwargs来调用这个函数;
2. allocate_lock() 分配一个LockType类型的锁对象
3. exit() 让线程退出;
LockType类型锁对象方法
1. acquire(wait=None) 尝试获取锁对象
2.locked()如果获取了锁对象返回True,否则返回False
3、release()释放锁
多线程小例子:

#!/usr/bing/env python

import thread
from time import sleep, ctime

def loop0():
print 'start loop 0 at:', ctime()
sleep(4)
print 'end loop 0 at:', ctime()

def loop1():
print 'start loop 1 at:', ctime()
sleep(2)
print 'end loop 1 at:', ctime()

def main():
print 'start at:', ctime()
thread.start_new_thread(loop0, ())
thread.start_new_thread(loop1, ())
sleep(6)
print 'all done at:', ctime()

if __name__ == '__main__':
main()
输出结果:

start at: Tue Mar 06 22:44:52 2012
start loop 1 at: Tue Mar 06 22:44:52 2012
start loop 0 at: Tue Mar 06 22:44:52 2012
end loop 1 at: Tue Mar 06 22:44:54 2012
end loop 0 at: Tue Mar 06 22:44:56 2012
all done at: Tue Mar 06 22:44:58 2012
输出结果中可以看出,由于使用了多线程,因此总的运行时间减少了,并不是6秒,而是在4秒的时候两个函数就运行结束了,达到了并行执行(起码看起来是并行的)。为了防止主线程退出后,导致loop0和loop1线程退出,因此在主线程中增加了sleep(6),这样就导致整个程序的运行时间没有减少。因此需要使用锁来进行同步。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import thread
from  time import sleep, ctime

loops = [4, 2]

def loop(nloop, nsec, lock):
print 'start loop', nloop , 'at:', ctime()
sleep(nsec)
print 'end loop 0 at:', ctime()
lock.release()

def main():
print 'starting at:', ctime()
locks = []
nloops = range(len(loops))

for i in nloops:
lock = thread.allocate_lock()
lock.acquire()
locks.append(lock)

for i in nloops:
thread.start_new_thread(loop, (i, loops[i], locks[i]))

for i in nloops:
while locks[i].locked():pass

print 'all done at:', ctime()

if __name__ == '__main__':
main()
执行结果:

starting at: Wed Mar 07 16:59:08 2012
start loop 0 at: Wed Mar 07 16:59:08 2012
start loop 1 at: Wed Mar 07 16:59:08 2012
end loop 0 at: Wed Mar 07 16:59:10 2012
end loop 0 at: Wed Mar 07 16:59:12 2012
all done at: Wed Mar 07 16:59:12 2012
从结果中可以看出,总的运行时间变为4秒,达到了并行执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: