rank vote view answer url
97 974 754731 17 url

如何使用线程


这个是2010年提的问题了,这有一种使用 mappool 的方法来使用线程.

下面的代码总结自 Parallelism in one line: A Better Model for Day to Day Threading Tasks,仅仅使用了几行代码:

from multiprocessing.dummy import Pool as ThreadPool 
pool = ThreadPool(4) 
results = pool.map(my_function, my_array)

使用 multithreaded 的版本:

results = []
for item in my_array:
    results.append(my_function(item))

解释

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

img

实现

并行版本的 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))

如果使用老版本的 Python, 可以通过这个方法来实现