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

         最近又用到了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秒,达到了并行执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值