一、示例代码:
from multiprocessing.dummy import Pool as ThreadPool
import time
import requestsurls = [ # 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.textelse:return ''if __name__ == '__main__':urls = urls * 1start = 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模块也可以实现进程池方式。