【问题标题】:Python multithreading or multiprocessing?Python多线程还是多处理?
【发布时间】:2020-12-13 22:23:11
【问题描述】:

由于这是一个设计问题,我认为代码无法做到这一点。

我正在编写一个程序来处理和记录高带宽数据流,并同时尝试实时观察该数据。 (就像生产线和检查员看着生产线)

我想在我的计算机上的内核之间分配负载,以便为未来的功能留出空间,但我不知道我是否可以为此使用多处理。似乎大多数多处理示例都有初始数据集和输出,并且不需要在其整个生命周期中进行主动通信。

我是否能够使用多处理在进程之间进行主动通信,或者这是一个坏主意,我应该坚持使用多线程?

【问题讨论】:

  • 你使用的是什么 Python 实现?如果是 CPython,由于 GIL,多线程仅适用于几乎纯 I/O 边界任务。要在处理器之间分配实际工作,您需要多处理。并且数据可以在创建后通过在创建时给它们一个队列对象来馈送到进程中,您可以从进程外部将数据推送到该队列对象中。
  • @Carcigenicate 只是标准 python3
  • 那么,那将是 CPython,如果您正在处理数据,则需要查看 multiprocessing
  • @Carcigenicate 好的,我担心由于某些我不知道的原因,进程不应该相互依赖

标签: python multithreading multiprocessing


【解决方案1】:

如果您预计处理信号处理的全部负载所需的计算量超过单核的能力,您应该考虑使用多处理将负载分散到多个核上。

如果您预计需要在单个内核上进行计算,但您预计许多缓慢或阻塞的 I/O 操作会阻碍工作,那么您应该考虑多线程。

如果整体性能是一个问题,您应该重新考虑用纯常规 Python 编写实际解决方案,而是寻找另一种语言的实现,或者使用能够让您获得更接近硬件的解决方案的 Python 版本。当然,您仍然可以想出一个可以在常规 Python 程序中使用的结果。

【讨论】:

    【解决方案2】:

    多处理和多线程是两种不同的代码执行方式。

    在多处理中,您基本上只是在使用更多 CPU 时投入更多的原始计算能力(因此得名)。

    https://en.wikipedia.org/wiki/Multiprocessing#:~:text=Multiprocessing%20is%20the%20use%20of,to%20allocate%20tasks%20between%20them.

    多线程是指 CPU 基本上将代码分解为更多的代码“线程”以同时执行多个任务。

    https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)#:~:text=In%20computer%20architecture%2C%20multithreading%20is,supported%20by%20the%20operating%20system.

    对于正常线性的 Python(即它从第 1 行按顺序运行到代码末尾),线程更适合网络绑定或多处理(如果其 CPU 受限)。

    https://timber.io/blog/multiprocessing-vs-multithreading-in-python-what-you-need-to-know/

    这就是区别,代码的结果和系统的运行方式将决定您是使用多处理还是多线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2020-11-25
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多