废话不多说,直接上代码。使用了两个包,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'