全部博文(2065)
分类: Python/Ruby
2009-02-18 11:48:47
如果一个线程t1在执行的过程中需要等待另一个线程t2执行结束后才能运行的话那就可以在t1在调用t2的join()方法
....
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 中使用线程时,这个模式是一种很常见的并且推荐使用的方式。具体工作步骤描述如下:
Queue.Queue()
的实例,然后使用数据对它进行填充。threading.Thread
的方式创建的。queue.task_done()
函数向任务已经完成的队列发送一个信号。