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()释放锁
多线程小例子:
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秒,达到了并行执行。
相关文章推荐
- Python:使用threading模块实现多线程编程八[使用Event实现线程间通信]
- Python使用Threading模块创建线程
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- Python:使用threading模块实现多线程编程二[两种方式起线程]
- Python:使用threading模块实现多线程编程八[使用Event实现线程间通信]
- Python 线程的使用(threading模块)
- python学习笔记之使用threading模块实现多线程(转)
- python多线程(2)--thread和threading模块的使用
- Python:使用threading模块实现多线程编程七[使用Condition实现复杂同步]
- Python:使用threading模块实现多线程编程七[使用Condition实现复杂同步]
- 11.python并发入门(part2 threading模块的基本使用)
- 在python中实现生产者和消费者的例子(五):使用threading模块和全局变量
- Python模块整理(四):线程模块threading
- python之潜心研究多线程(thread模块) 建议使用threading模块
- Python:使用threading模块实现多线程编程一[综述]
- Python:使用threading模块实现多线程编程
- Python:使用threading模块实现多线程(转)
- python模块之threading: 在python中使用多线程
- 树莓派 - 2 Python - b 网络与进程/线程模块:socket, threading, subprocess