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

来源:互联网 发布:大数据时代下营销伦理 编辑:程序博客网 时间:2024/05/08 16:27

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

#!/usr/bin/env python # -*- coding: utf-8 -*-import threadfrom  time import sleep, ctimeloops = [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 2012start loop 0 at: Wed Mar 07 16:59:08 2012start loop 1 at: Wed Mar 07 16:59:08 2012end loop 0 at: Wed Mar 07 16:59:10 2012end loop 0 at: Wed Mar 07 16:59:12 2012all done at: Wed Mar 07 16:59:12 2012
从结果中可以看出,总的运行时间变为4秒,达到了并行执行。