ASPONE.CN
苦逼

Python 的多线程/进程和线程池/进程池总结

废话不多说,直接上代码。使用了两个包,futures 和 multiprocessing,支持 ThreadPool 和 ProcessPool。

怎么区分进程和线程呢,简单的说就是多进程可以在任务列表里看见多个进程,多线程可以在任务列表里看到1个进程有多个线程。

之前还有一篇说 multiprocessing 的文章。

#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'


Copyright © 2016 ASPONE.CN. All Rights Reserved. 京ICP备18038662号