当前位置: 首页 > 面试题库 >

Python-如何在Python中使用线程?

薄哲
2023-03-14
问题内容

我试图了解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代码的关键。对于那些不熟悉的人来说,地图是从Lisp等功能语言中提炼出来的。它是将另一个功能映射到序列上的功能。

Map为我们处理序列上的迭代,应用函数,并将所有结果存储在最后的方便列表中。

在此处输入图片说明

实作

map函数的并行版本由以下两个库提供:multiprocessing,以及鲜为人知但同样出色的继子child:multiprocessing.dummy

multiprocessing.dummy与多处理模块完全相同,但是使用线程代替(一个重要的区别 -使用多个进程来处理CPU密集型任务;用于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))


 类似资料:
  • 问题内容: 如何设置Selenium与Python一起使用?我只想用Python编写/导出脚本,然后运行它们。是否有任何资源?我尝试使用谷歌搜索,但是发现的东西要么是指Selenium(RC)的过时版本,要么是Python的过时版本。 问题答案: 您是说Selenium WebDriver吗?… 先决条件 :根据您的操作系统安装Python 使用以下命令安装 并在您的代码中使用此模块 您还可以根据

  • 问题内容: 我打算为Python安装一个虚拟环境,以使我的Python包分开。这样做的动机之一也是在我的机器上同时存在两个版本的Python(Ubuntu 14.04)。我有以下奇观: 应该以什么顺序安装Python,PIP和virtualenv?有关系吗? 完成后,如何在virtualenv下将两个python版本分开? 假设我正在处理单独的项目,是否建议将每个项目都保存在virtualenv创

  • 问题内容: 我正在尝试对正在编写的C python扩展进行memcheck,但是我无法设置valgrind与python一起使用。我真的很感谢一些建议。仅出于上下文考虑,这是Ubuntu 13.10,python 2.7.5+和valgrind 3.8.1。 根据我的建议,我做了以下工作。 1)下载了python源 2)应用了代码补丁,即“在Objects / obmalloc.c中取消注释Py_

  • 问题内容: 我刚刚在Windows 7计算机上安装了OpenCV。结果,我得到一个新目录: 在此目录中,我有两个文件:和。 然后,我尝试使用from Python。我执行以下操作: 结果,我收到以下错误消息: 我究竟做错了什么? 添加 至于有人建议在这里,我抄的内容的。它没有帮助。 加了2 我的环境变量具有以下值: 我需要改变什么吗?我需要添加一些东西吗? 加3 我认为我的问题很笼统:如何使用图书

  • 问题内容: 我在Vim和Python之间浪费了很多时间。我发现手动将其从Python复制粘贴到Vim,反之亦然,这太慢了。一个坏的例子是: %!python在xrange(25)中为我 打印6 * i \ n 您如何在Vim中直接进行此类调整? [解决了] [说明] 我需要Vim要做的事情,例如打印序列,算术…-我无法在Vim中做的事情。 [?] 有人可以详细说明这一点:“您的脚本可以从stdin

  • 问题内容: 我找到了有关subprocess.check_output()的文档,但是找不到带有参数的文档,而且该文档也不是很深入。我正在使用Python 3(但试图通过Python 3运行Python 2文件) 我正在尝试运行以下命令: -i是argparse的位置参数,test.txt是-i,py2.py是要运行的文件 我尝试了很多(无效)变体,包括: 问题答案: 正确的答案(使用Python