如何在 Python 中使用线程?

新手上路,请多包涵

我正在尝试理解 Python 中的线程。我查看了文档和示例,但坦率地说,许多示例过于复杂,我无法理解它们。

您如何清楚地显示为多线程划分的任务?

原文由 albruno 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 389
1 个回答

自从 2010 年提出这个问题以来,如何使用 mappool 使用 Python 进行简单的多线程处理已经有了真正的简化。

下面的代码来自一篇文章/博客文章,您一定要查看(无从属关系)- 一行中的并行性:日常线程任务的更好模型。我将在下面进行总结 - 它最终只是几行代码:

 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,以及它鲜为人知但同样出色的 step child:multiprocessing.dummy。

multiprocessing.dummy 与多处理模块完全相同, 但使用线程代替一个重要的区别- 使用多个进程进行 CPU 密集型任务;线程用于(和期间)I/O ):

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


传递多个参数仅在 Python 3.3 及更高版本中 有效):

传递多个数组:

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

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

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

如果您使用的是早期版本的 Python,则可以通过 此解决方法 传递多个参数)。

(感谢 user136036 的有用评论。)

原文由 philshem 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题