<p>您可以使用sentinel值向线程发出没有工作的信号,并连接线程,而不是<code>queue.task_done()</code>和{<cd2>}:</p>
<pre><code>#!/usr/bin/env python
import socket
from Queue import Queue
from threading import Thread
def getips(queue):
for site in iter(queue.get, None):
try: # resolve hostname
result = socket.gethostbyname_ex(site)
except IOError, e:
print("error %s reason: %s" % (site, e))
else:
print("done %s %s" % (site, result))
def main():
websites = "youtube google non-existent.example facebook yahoo live".split()
websites = [name+'.com' for name in websites]
# Spawn thread pool
queue = Queue()
threads = [Thread(target=getips, args=(queue,)) for _ in range(20)]
for t in threads:
t.daemon = True
t.start()
# Place work in queue
for site in websites: queue.put(site)
# Put sentinel to signal the end
for _ in threads: queue.put(None)
# Wait for completion
for t in threads: t.join()
main()
</code></pre>
<p><code>gethostbyname_ex()</code>函数已过时。要同时支持IPv4/v6地址,可以使用<a href="http://docs.python.org/library/socket.html#socket.getaddrinfo" rel="nofollow">^{<cd4>}</a>。在</p>