python 线程

jopen 11年前

对比threading ,自己建立线程池。与python提供模块,multiprocessing.dummy, pool,map的运用

引入:Map

Map是个很酷的小功能,也是简化Python并发代码的关键。对那些不太熟悉Map的来说,它有点类似Lisp.它就是序列化的功能映射功能. e.g.

urls = [', ']  results = map(urllib2.urlopen, urls)

这里调用urlopen方法,并把之前的调用结果全都返回并按顺序存储到一个集合中。这有点类似

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

Map能够处理集合按顺序遍历,最终将调用产生的结果保存在一个简单的集合当中。

示例:

from multiprocessing.dummy import Pool  ...  pool = Pool()  pool.map(funtion,funtion_para_list)    pool.close()   pool.join()

其中,

  1. pool()带参数,如果不带,则默认使用系统的内核数,也可以自己加上内核数,比如4.

  2. funtion,是一个处理函数 ,而处理的对象作为一个参数,传入该函数,如果对象有多个,可以先生成一个列。

  3. 使用pool.map()传入函数和参数队列。

  4. 返回的结果,也是以一个列进行保存。

使用上有限制,你要处理的对象(函数的参数)必须是已知的,存放于一个队列中。然后使用map来进行处理。pool的作用是把内核都使用起来。这里我认为使用默认的内核数比较好。与传统的thread比较,其优势在于,对于处理已知的对象,可以更快,而对于未知的对象(对象不确定,不能简单的生成一个队列来处理),还是使用传统的thread更加合适。