一、示例代码:
from multiprocessing.dummy import Pool as ThreadPool
import time
import requests
urls = [ # URL队列,通过多线程访问
'http://www.python.org',
'http://www.python.org/about/',
'http://www.python.org/doc/',
'http://www.python.org/download/',
'http://www.python.org/getit/',
'http://www.python.org/community/',
'https://wiki.python.org/moin/',
'http://planet.python.org/',
'https://wiki.python.org/moin/LocalUserGroups',
'http://www.python.org/psf/',
'http://docs.python.org/devguide/',
'http://www.python.org/community/awards/'
]
def openurl(url):
res = requests.get(url)
if res.status_code == 200:
return res.text
else:
return ''
if __name__ == '__main__':
urls = urls * 1
start = time.time()
pool_1 = ThreadPool(1)
results = pool_1.map(openurl, urls)
pool_1.close()
pool_1.join()
print('单线程执行时间:', time.time()-start)
start_2 = time.time()
pool_2 = ThreadPool()
results_2 = pool_2.map(openurl, urls)
pool_2.close()
pool_2.join()
print('多线程执行时间:', time.time()-start_2)
二、关键函数说明:
利用multiprocessing.dummy创建并使用线程池。主要函数:
pool=ThreadPool(n):创建由n个线程组成的线程池。n值即CPU的核数。默认值省略参数。
results=pool.map(openurl,urls):在线程中执行打开网页并获取结果的操作。
pool.close():关闭pool,不再接收新的任务。
pool.join():等待子进程的退出。一定要注意,必须在调用close()方法后才能调用join()。
执行close()方法后不允许新的进程加入线程池,join()方法等待所有子进程结束。
上述代码采用了线程池方式。利用multiprocessing.pool模块也可以实现进程池方式。