Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26316604
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Python/Ruby

2009-02-18 11:48:47

如果一个线程t1在执行的过程中需要等待另一个线程t2执行结束后才能运行的话那就可以在t1在调用t2join()方法

....
def t1(...):
...
t2.join()
...

这样t1在执行到t2.join()语句后就会等待t2结束后才会继续运行。

如果t2为一个while 1:怎么办呢?OK 可以

def t1(...):
...
t2.join(10)  #表示的是一个线程对象才能调用此方法的哦!会等待它调用完之后再去执行其他操作
...

设置一个时间,太长了就不执行了哈哈

[[如果要解决主线程退出的情况从线程也要同步退出的操作的话那可以这样来处理的:

需要注意的是setDaemon()方法必须在线程对象没有调用start()方法之前调用,否则没效果。

t1 = mythread('t1')
print t1.getName(),t1.isDaemon()
t1.setDaemon(True)
print t1.getName(),t1.isDaemon()
t1.start()
print 'main thread exit'

当执行到 print 'main thread exit' 后,主线程就退出了,当然t1这个线程也跟着结束了。但是如果不使用t1线程对象的setDaemon()方法的话,即便主线程结束了,还要等待t1线程自己结束才能退出进程。isDaemon()是用来获得一个线程对象的Daemonflag状态的。

一个比较好的解决缓冲区多线程的代码:

#!/usr/bin/env python
import Queue
import threading
import urllib2
import time

hosts = ["", "", "",
"", ""] #可以表示从数据库中查询出来的记录

queue = Queue.Queue() #建立队列

class ThreadUrl(threading.Thread):
"""Threaded Url Grab"""
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue

def run(self):
while True: #一直进行监听操作
#grabs host from queue
host = self.queue.get()

#grabs urls of hosts and prints first 1024 bytes of page
url = urllib2.urlopen(host)
print url.read(1024)

#signals to queue job is done
self.queue.task_done()

start = time.time()
def main():

#spawn a pool of threads, and pass them queue instance
for i in range(5):
t = ThreadUrl(queue)
t.setDaemon(True)
t.start()

#populate queue with data
for host in hosts:
queue.put(host)

#wait on the queue until everything has been processed
queue.join()

main()
print "Elapsed Time: %s" % (time.time() - start)

在 Python 中使用线程时,这个模式是一种很常见的并且推荐使用的方式。具体工作步骤描述如下:
  1. 创建一个 Queue.Queue() 的实例,然后使用数据对它进行填充。
  2. 将经过填充数据的实例传递给线程类,后者是通过继承 threading.Thread 的方式创建的。
  3. 生成守护线程池。
  4. 每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作。
  5. 在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号。
  6. 对队列执行 join 操作,实际上意味着等到队列为空,再退出主程序。



阅读(2140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~