以下是IBM python线程教程的示例。我正在浏览此网址(http://www.ibm.com/developerworks/aix/library/au-threadingpython/)
#!/usr/bin/env python
import Queue
import threading
import urllib2
import time
hosts = ["http://yahoo.com", "http://google.com", "http://amazon.com",
"http://ibm.com", "http://apple.com"]
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)
此处的示例完美无缺。我一直在寻找一个略有不同的修改。这里有已知数量的URL,例如5.在for循环中使用范围(5)迭代URL并处理它。
如果,我只想使用' 5'处理1000个URL的线程?因此,当一个线程完成时,应该从队列中删除已完成的URL,并且需要将新URL添加到队列中。但所有这些都应该通过使用相同的线程来实现。
我可以查看,
if self.queue.task_done():
return host
这是我可以检查URL是否成功处理的唯一方法。返回后,我应该从队列中删除URL。并向队列添加新URL。如何使用队列实现这个?
谢谢,
答案 0 :(得分:0)
该代码已经完成了您所描述的内容。如果你把1000个项目放入队列而不是5个,那么它们将由相同的5个线程处理 - 每个线程将从队列中获取一个项目,处理它,然后只要队列中有剩余项目就接受一个新项目