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

Python:何时使用线程与多处理

羊刚捷
2023-03-14
问题内容

在效率和代码清晰性方面,决定使用线程或多处理时应遵循哪些良好准则?


问题答案:

线程和多处理之间的许多差异并不是真正针对Python的,某些差异特定于某个Python实现。

对于CPython,multiprocessing在以下情况下,我都将使用该模块:

  • 由于性能原因,我需要同时使用多个内核。使用线程时,全局解释器锁(GIL)将阻止任何加速。(无论如何,有时在这种情况下您都ctypes可以避免使用线程,例如,当主要工作是在通过调用的C代码中完成或使用Cython并在适当的地方显式释放GIL时。当然,后者需要格外小心。)这种情况实际上很少见。大多数应用程序不受处理器时间的限制,如果确实如此,则通常不使用Python。

  • 我想稍后将我的应用程序变成一个真正的分布式应用程序。对于多处理应用程序而言,这要容易得多。

  • 在要执行的任务之间几乎不需要共享状态。

在几乎所有其他情况下,我都会使用线程。(这包括使GUI应用程序具有响应能力。)



 类似资料:
  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 问题内容: 我发现在Python 3.4中,用于多处理/线程的库很少:多处理vs线程与asyncio。 但是我不知道使用哪个,或者是“推荐的”。他们做的是同一件事还是不同?如果是这样,则将哪一个用于什么?我想编写一个在计算机上使用多核的程序。但是我不知道我应该学习哪个图书馆。 问题答案: 它们旨在(略有)不同的目的和/或要求。CPython(典型的主线Python实现)仍然具有全局解释器锁,因此多

  • 问题内容: 我试图理解多处理比线程的优势。我知道多处理绕过了全局解释器锁,但是还有什么其他优点,线程不能做同样的事情? 问题答案: 该模块使用线程,该模块使用进程。不同之处在于线程在相同的内存空间中运行,而进程具有单独的内存。这使得在具有多处理的进程之间共享对象更加困难。由于线程使用相同的内存,因此必须采取预防措施,否则两个线程将同时写入同一内​​存。这就是全局解释器锁的作用。 生成过程比生成线程

  • 我正在尝试用Python编写一个程序。我想写的是一个脚本,它会立即向用户返回一条友好的消息,但会在后台生成一个长的子进程,它会处理几个不同的文件,并将它们写入一个祖父文件。我已经做了一些关于线程和处理的教程,但我遇到的是,无论我尝试什么,程序都会一直等待,直到子进程完成,然后才会向用户显示前面提到的友好消息。以下是我尝试过的: 线程示例: 我读过这些关于多线程的SO帖子如何在Python中使用线程

  • 问题内容: 根据python的GIL,我们不能在CPU绑定的进程中使用线程,所以我的问题是Apache Spark如何在多核环境中利用python? 问题答案: 多线程python问题与Apache Spark内部结构分开。Spark上的并行性在JVM内部处理。 原因是在Python驱动程序中,使用Py4J启动JVM并创建JavaSparkContext。 Py4J仅在驱动程序上用于Python和

  • 问题内容: 我正在使用这些功能在画布上绘制小圆圈: 这是绘制圆圈的功能: 这个创建画布和圆圈: 我称这些行来运行项目: 什么是执行正确的方法,并在不同的线程? 我已经尝试了以下方法,但无法使其正常工作。: 有人可以告诉我如何运行这些线程吗? 问题答案: 当需要此功能时,您要做的是通过将事件置于线程共享的队列中来安排要执行的事件。这样,在给定线程中,您可以通过排队指定要运行“ create(50,…