【问题标题】:Will operating system (any or at least linux) automatically distribute started threads between cores? [duplicate]操作系统(任何或至少是 linux)会自动在内核之间分配启动的线程吗? [复制]
【发布时间】:2019-06-14 06:17:37
【问题描述】:

我正在编写并发软件,毕竟我的文档都变红了,我确信多线程模块(与 asyncio 相同)绑定到单个 python 进程和运行它的单核。

但最近我的同事说,在某些来源(他找不到确切的链接)中,他发现操作系统会自动在可用内核之间分配由 python 产生的线程。 我听说操作系统可以管理线程但找不到关于 python 线程行为的明确信息,现在我有疑问了。

那么,操作系统是如何控制python线程的呢?

例如,https://realpython.com/async-io-python/https://medium.com/contentsquare-engineering-blog/multithreading-vs-multiprocessing-in-python-ece023ad55a 表示多核使用需要多处理模块。

抱歉,我没有清晰描述问题的 sn-ps

【问题讨论】:

  • 是的,它可能会,但是由于 GIL (wiki.python.org/moin/GlobalInterpreterLock),2 个 Python 线程不会同时运行。
  • @CristiFati 所以粗略地说,在运行 python 应用程序和 CPU 密集型任务的情况下,多核的这种使用是“无用的”?
  • @CristiFati 您能否将您的回复写为答案,以便我将其标记为解决方案?
  • 我是说当涉及到并行计算(CPU 密集型操作,可以并行执行并且可以从多个内核中受益)时,线程 i> 是要避免的(multiprocessing 是首选)。
  • @CristiFati 我想知道......也许操作系统足够聪明,可以意识到它本质上是单线程的,并将其保持在同一个内核上以减少内核间开销?

标签: python python-3.x multithreading python-multithreading cpu-cores


【解决方案1】:

使用默认的 python 实现,答案是否定的。由于全局解释器锁,python 中的多个线程实际上并不是同时执行,而是依次执行指令。根据Python Wiki 的说法,使用 GIL 是因为 python 的内存管理不是线程安全的,这意味着如果两个操作同时运行,可能会导致问题。

一些自定义实现(例如 Jython 和 IronPython)不使用 GIL,因此应该能够利用多核处理器,但是使用 GIL 的实现只能使用单核。

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 2012-10-23
    • 2014-05-12
    • 2019-10-23
    • 2013-02-26
    • 2018-03-19
    • 2019-06-15
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多