2、利用map实现并行任务技巧

何不试试 map

map 这一小巧精致的函数是简捷实现 Python 程序并行化的关键。map 源于 Lisp 这类函数式编程语言。它可以通过一个序列实现两个函数之间的映射。

 urls = [ http://www.yahoo.com ,  http://www.reddit.com ]
 results = map(urllib2.urlopen, urls)

上面的这两行代码将 urls 这一序列中的每个元素作为参数传递到 urlopen 方法中,并将所有结果保存到 results 这一列表中。其结果大致相当于:

results = []
for url in urls: 
    results.append(urllib2.urlopen(url))

解释

Map 是一个非常 cool 的函数,它可以轻易地使你地 Python 代码实现并行.Map 是从像
Lisp 这种函数式语言学来的.它地作用是对序列中的每个元素进行函数的调用. Map 将迭
代序列上所有的元素并且调用函数,最后将结果存储到列表中.

为什么这很重要呢?这是因为借助正确的库,map 可以轻松实现并行化操作。

image

在 Python 中有个两个库包含了 map 函数: multiprocessing 和它鲜为人知的子库 multiprocessing.dummy.

dummy 是 multiprocessing 模块的完整克隆,唯一的不同在于 multiprocessing 作用于进程,而 dummy 模块作用于线程(因此也包括了 Python 所有常见的多线程限制)。
所以替换使用这两个库异常容易。你可以针对 IO 密集型任务和 CPU 密集型任务来选择不同的库。

实现

并行版本的 Map 需要两个库来实现: multiprocessing 和 很少人知道的multiprocessing.dummy.
multiprocessing.dummy 和 multiprocessing 模块很像, 但是使用线程进行替代(很重要的区别,
进程处理 CPU 密集型作业, 而线程处理 IO 密集型作业)
multiprocessing.dummy实现了和 multiprocessing 一样当 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

传入多个参数(像这样只在 Python3.3及更高版本生效)
传入多个数组:

results = pool.starmap(function, zip(list_a, list_b))

或者传递一个 constan(常量) 和数组:

results = pool.starmap(function, zip(itertools.repeat(constant), list_a))

你可能感兴趣的:(2、利用map实现并行任务技巧)