【问题标题】:Mixing threading of c function with python's multiprocessing将c函数的线程与python的多处理混合
【发布时间】:2016-06-07 20:09:58
【问题描述】:

我正在 Linux 上编写一个 python 2.7.11 程序。该程序使用 multiprocessing.Pool 创建 12 个子进程。每个子进程通过 Python 的 psutil 库与 12 个 cpu 之一具有 cpu 亲和性。

我使用multiprocessing.Event让11个子进程等待子进程0。

然后,在子进程 0 中,我调用 Intel 的数学内核库开始计算 12 个线程。

等待的子进程会不会消耗cpu资源,影响12个线程的计算?

如果是这样,如何避免这种情况?或者,如何测试是否发生这种情况?

主进程会影响12个线程的计算吗?

谢谢。

【问题讨论】:

  • 一般来说,没有。假设操作系统将进程分配给系统中不同的核心/处理器,一个不应该影响另一个。缺乏细节,很难更具体。你能发布一些示例代码吗?
  • 这12个子流程不会相互影响。但是,“等待”的 12 个子进程会影响 intel 的 mkl 从子进程 0 启动的 12 个线程吗?只有 12 个 cpu .... 我可以尝试制定代码的简化版本。整个事情,包括接口 python numpy 和 intel mkl 的 ctypes 都相当长。

标签: python multithreading parallel-processing multiprocessing


【解决方案1】:

好的,我做了一些研究,然后...

首先,由于 12 个线程都在一个进程中,因此其他子进程中发生的事情不应该以任何方式影响父进程。操作系统发生了一些后台处理来处理进程间通信,这些通信将发生在操作系统内核所在的进程中,大概是父进程(进程 0)。然而,这是非常轻微的,不应受到其他进程中的活动的影响。

换句话说,一个进程中的大量活动不应影响另一个进程。

我建议两件事。

1) 再添加一个进程来启动 12 个线程。这会将其与操作系统所在的父线程分开。

2) 做一些你自己的测试。使用当前毫秒计时器在每个线程开始时设置一个变量。在处理结束时,检查花费了多长时间。然后让其他进程进行一些无意义的浮点计算,看看这是否会影响线程的平均运行时间。

Time 模块、Multiprocessing 模块和Threading 模块进行一些研究应该有助于为您阐明主题。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2015-02-11
    • 2021-06-26
    • 2019-09-04
    • 1970-01-01
    • 2013-06-29
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多