和 map 进行简单的多线程处理已经有了真正的简化 pool .
下面的代码来自一篇文章/博客文章,你一定要看看(无关联) - 一行中的并行性:日常线程任务的更好模型 。我将在下面总结 - 它最终只是几行代码:
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
results = pool.map(my_function, my_array)
这是多线程版本:
results = []
for item in my_array:
results.append(my_function(item))
描述
Map 是一个很酷的小函数,也是轻松将并行性注入 Python 代码的关键。对于那些不熟悉的人来说,map 是从 Lisp 等函数式语言中借鉴而来的东西。它是一个将另一个函数映射到序列上的函数。
Map 为我们处理序列上的迭代,应用函数,并在最后将所有结果存储在一个方便的列表中。
执行
两个库提供了 map 函数的并行版本:multiprocessing,以及其鲜为人知但同样出色的子步骤:multiprocessing.dummy。
multiprocessing.dummy
与多处理模块完全相同, 但是使用线程 ( an important distinction - use multiple processes for CPU-intensive tasks; threads for (and during) I/O ):
multiprocessing.dummy 复制了多处理的 API,但只不过是线程模块的包装器。
import urllib2
from multiprocessing.dummy import Pool as ThreadPool
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
'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/',
]
# Make the Pool of workers
pool = ThreadPool(4)
# Open the URLs in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
# Close the pool and wait for the work to finish
pool.close()
pool.join()
计时结果如下:
Single thread: 14.4 seconds
4 Pool: 3.1 seconds
8 Pool: 1.4 seconds
13 Pool: 1.3 seconds
传递多个参数 仅在 Python 3.3 及更高版本中 有效 ):
传递多个数组:
results = pool.starmap(function, zip(list_a, list_b))
或者传递一个常量和一个数组:
results = pool.starmap(function, zip(itertools.repeat(constant), list_a))
如果您使用的是早期版本的 Python,则可以通过 此解决方法 )。
(感谢 user136036 有益评论。)