Python线程 - 使用有限的线程,迭代n个项目

时间:2014-06-06 07:47:11

标签: python

以下是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。如何使用队列实现这个?

谢谢,

1 个答案:

答案 0 :(得分:0)

该代码已经完成了您所描述的内容。如果你把1000个项目放入队列而不是5个,那么它们将由相同的5个线程处理 - 每个线程将从队列中获取一个项目,处理它,然后只要队列中有剩余项目就接受一个新项目