<p>您可能会发现使用<a href="http://docs.python.org/dev/library/concurrent.futures.html#threadpoolexecutor-example" rel="nofollow noreferrer">^{<cd1>}</a>比直接使用<code>threading</code>、<code>multiprocessing</code>、<code>Queue</code>更简单:</p>
<pre><code>#!/usr/bin/env python3
import socket
# pip install futures on Python 2.x
from concurrent.futures import ThreadPoolExecutor as Executor
hosts = "youtube.com google.com facebook.com yahoo.com live.com".split()*100
with Executor(max_workers=20) as pool:
for results in pool.map(socket.gethostbyname_ex, hosts, timeout=60):
print(results)
</code></pre>
<p>注意:您可以轻松地从使用线程切换到进程:</p>
^{pr2}$
<p>如果<code>gethostbyname_ex()</code>在您的操作系统上不是线程安全的,例如<a href="https://stackoverflow.com/a/1212821/4279">it <em>might</em> be the case on OSX</a>,则需要它。在</p>
<p>如果要处理<code>gethostbyname_ex()</code>中可能出现的异常:</p>
<pre><code>import concurrent.futures
with Executor(max_workers=20) as pool:
future2host = dict((pool.submit(socket.gethostbyname_ex, h), h)
for h in hosts)
for f in concurrent.futures.as_completed(future2host, timeout=60):
e = f.exception()
print(f.result() if e is None else "{0}: {1}".format(future2host[f], e))
</code></pre>
<p>它类似于<a href="http://docs.python.org/dev/library/concurrent.futures.html#threadpoolexecutor-example" rel="nofollow noreferrer">the example from the docs</a>。在</p>