废话不多说,直接上代码。使用了两个包,futures 和 multiprocessing,支持 ThreadPool 和 ProcessPool。
怎么区分进程和线程呢,简单的说就是多进程可以在任务列表里看见多个进程,多线程可以在任务列表里看到1个进程有多个线程。
#coding:utf-8 from concurrent import futures from multiprocessing.pool import ThreadPool import urllib2 import multiprocessing import os, sys URLS = [ 'http://www.aspone.me/', 'http://www.baidu.com/', 'http://www.openstack.org/', 'http://www.drcloud.cn/', 'http://www.163.com/', 'http://www.microsoft.com/', 'http://www.python.org/' ] def load_url(url, timeout): print 'accept mission {0}'.format(url) return urllib2.urlopen(url, timeout=timeout).read() if __name__ == "__main__": if len(sys.argv) > 1: if sys.argv[1] == '1': pool = ThreadPool(3) ret = dict((pool.apply_async(load_url, (url, 60)), url) for url in URLS) pool.close() pool.join() for i in ret: print '%r page is %d bytes' % (ret[i], len(i.get())) if sys.argv[1] == '2': with futures.ThreadPoolExecutor(max_workers = 3) as executor: future_to_url = dict((executor.submit(load_url, url, 60), url) for url in URLS) for future in futures.as_completed(future_to_url): url = future_to_url[future] if future.exception() is not None: print '%r generated an exception: %s' % (url, future.exception()) else: print '%r page is %d bytes' % (url, len(future.result())) if sys.argv[1] == '3': pool = multiprocessing.Pool(processes = 3) ret = dict((pool.apply_async(load_url, (url, 60)), url) for url in URLS) pool.close() pool.join() for i in ret: print '%r page is %d bytes' % (ret[i], len(i.get())) else: print '\n' + '*' * 40 + '\n' print 'execute: python ' + os.path.realpath(__file__) + ' (mod)\n' print 'mod:' print ' 1: multiprocessing.pool ThreadPool (ThreadPool)' print ' 2: futures.ThreadPoolExecutor (ThreadPool)' print ' 3: multiprocessing.Pool (ProcessPool)' print '\n' + '*' * 40 + '\n'