Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53821
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 152
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-06 21:55
文章分类

全部博文(14)

文章存档

2015年(2)

2014年(12)

我的朋友

分类: Python/Ruby

2014-02-16 21:00:24

线程是轻量级的进程,所有的线程运行于同一个进程中,共享相同的运行环境
Python代码是由Python解释器运行的,实际上解释器中同时只有一个线程在运行,它由全局解释器锁(GIL)来保证这一点。在所有面向I/O的程序来说,GIL会在I/O调用完之前被释放,以允许其他线程在这段等待I/O的时间内运行,故I/O密集型程序更能充分利用多线程的好处。
在python中使用线程有两个module: thread和threading.一般使用更高级别的threading模块:threading模块的同步原语更多,且thread模块对进程什么时候结束完全没有控制。
Threading模块中的Thread类是主要的运行对象,有三种调用它的方法:
a) 创建Thread的实例,传给一个函数
b) 创建Thread的实例,传给一个可调用的类对象
c) 从Thread派生一个子类,创建这个子类的实例

下边只给出第一种调用方法,是python核心编程上边的一个实例:

点击(此处)折叠或打开

  1. #coding=utf-8
  2. import threading
  3. from time import sleep, ctime
  4. loops=[4,2]
  5. def loop(nloop, nsec):
  6.     print 'start loop', nloop, 'at:', ctime()
  7.     sleep(nsec)
  8.     print 'loop', nloop, 'done at:', ctime()
  9.     
  10. def main():
  11.     print 'starting at:', ctime()
  12.     threads=[]
  13.     nloops=range(len(loops))
  14.     for i in nloops:
  15.         t=threading.Thread(target=loop, args=(i, loops[i]))
  16.         threads.append(t)
  17.     for i in nloops:
  18.         threads[i].start()
  19.     for i in nloops:
  20.         threads[i].join()
  21.         
  22.     print 'all DONE at:', ctime()
  23.     
  24. if __name__=='__main__':
  25.     main()

另外,用Queue模块可以极其简单的解决生产者-消费者问题。因为queue本身实现了阻塞读和阻塞写,所以只要为读和写各写一个函数,然后构造两个Thread类就好了,具体代码见Python核心编程
阅读(575) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~