【问题标题】:Python multithreading in IO-bound tasksIO 绑定任务中的 Python 多线程
【发布时间】:2020-03-20 16:23:07
【问题描述】:

建议仅在 IO-bound 任务中使用 Python 多线程,因为 Python 有一个全局解释器锁 (GIL),它只允许一个线程持有 Python 解释器的控制权。然而,Does multithreading make sense for IO-bound operations? 表示,一般来说,磁盘 IO 密集型任务中的多线程只有在访问多个磁盘时才有意义,因为瓶颈是磁盘。

鉴于此,如果我有多个任务同时运行单个本地磁盘中访问数据库,那么使用多线程是否有任何优势,因为瓶颈将是磁盘?

如果数据库存储在一个单个远程磁盘,答案会改变吗?我想可能是的,因为还有另一个变量可能是瓶颈:我和服务器之间的往返时间。

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    CPython 和 Pypy 在线程 CPU 密集型任务方面都存在问题。其他的,比如 Jython 和 IronPython 则没有。

    有时将多线程或多处理与 I/O 绑定的任务一起使用是有意义的,因为磁盘寻道对 CPU 来说是一个永恒的过程,所以如果您可以在等待磁盘响应时让一些 CPU 工作不碍事,你做了一件好事。

    如果您编写的代码具有可调整的并行度,您可以通过实验推断出适合您工作负载的良好数字。

    如果您编写代码以使用新的 concurrent.futures API,您可以(大部分)使用类似的方法轻松地在线程和进程之间切换:

    • concurrent.futures.ThreadPoolExecutor
    • concurrent.futures.ProcessPoolExecutor

    此 API 在 CPython 3.2 及更高版本以及 Tauthon 2.8 中可用。

    这是一个示例程序:http://stromberg.dnsalias.org/~strombrg/coordinate/

    HTH。

    【讨论】:

    • 1) 鉴于 Python 中 CPU 密集型任务与线程并行化的问题是由 GIL 引起的,那么 Jython 和 IronPython 如何避免呢? 2)如果磁盘寻道时间远大于任务中的处理时间(即它是一个IO绑定任务)并且只有一个本地磁盘,在我看来添加多个线程以获得“一些CPU工作”将是卑鄙的。对不对?
    • Jython 和 IronPython 没有 GIL。它们从不基于 GIL 的底层运行时(例如 JRE)继承内存管理。
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多