【问题标题】:Running functions siultaneoulsy in python在 python 中运行函数 siultaneoulsy
【发布时间】:2020-12-11 16:40:32
【问题描述】:

我正在制作一个小程序,其中需要一些函数来检查后台的某些内容。

我使用了模块线程,所有这些功能确实同时运行并且一切正常,直到我开始添加更多功能。随着线程模块产生新线程,它们都留在同一个进程中,所以当我添加更多线程时,它们开始相互减慢。

问题不在于 CPU,因为它的利用率从未达到 100% (i5-4460)。我还尝试了为函数创建新进程的多处理模块,但似乎变量无法在不同进程之间共享,或者我不知道如何共享。 (每个函数的新启动进程似乎都使用现有变量,但我的主程序无法访问该函数在单独进程中所做的任何更改,甚至无法访问它创建的新变量)

我尝试使用 global 关键字,但它在多处理中似乎没有像在线程中那样的效果。

我该如何解决这个问题?

我很确定我必须为这些后台功能创建新流程,但我需要从他们那里获得一些反馈,而那部分我不知道要解决。

【问题讨论】:

  • 显示演示要解决的问题的代码。
  • 我会看一些关于多处理的教程,希望我能在那里找到答案,如果我会在这里发布。
  • docs.python.org/3/library/multiprocessing.html 有小例子,包括如何共享变量。

标签: python multithreading module process global


【解决方案1】:

据我了解,您需要限制“处理器”的数量。

在这种情况下,我通常会生成固定数量(因此可通过参数配置)的处理器(即线程或进程),我称之为工人。

然后我使用共享任务队列 (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue) 向工作人员发送他们要做的工作,然后我使用另一个共享队列来放置他们的结果。

工作人员甚至可以填充任务队列,以便您在需要时从工作人员添加新任务。

【讨论】:

    【解决方案2】:

    根据docs.python.org 的“threading — 基于线程的并行性”的文档,它明确指出:

    CPython 实现细节:在 CPython 中,由于全局解释器锁,只有 一个线程可以一次执行 Python 代码(即使某些面向性能的库可能会克服这个限制)。 如果您希望您的应用程序更好地利用多核机器的计算资源,建议您使用 multiprocessing 或 concurrent.futures.ProcessPoolExecutor。 但是,如果您愿意,线程仍然是一个合适的模型同时运行多个 I/O 密集型任务。

    Python Multiprocessing

    【讨论】:

    • 我明白这一点,但是如何在进程之间交换信息(如何从启动的进程向我的主程序发送简单的 True 或 False)。我在 Multiprocessing 的文档中看到了一些方法,但是最好/最简单的方法是什么。
    【解决方案3】:

    我最终使用了多处理值

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 2020-07-31
      • 2022-11-30
      • 2023-03-28
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多