【问题标题】:Does ThreadPoolExecutor in python really workpython中的ThreadPoolExecutor真的有效吗
【发布时间】:2020-05-07 20:25:38
【问题描述】:

我正在尝试使用多个线程编写更快的 python 代码。我不想使用ProcessPoolExecutor 来保存内存消耗。

所以,当我使用 ThreadPoolExecutor.map 时,它将迭代器映射到函数。代码所花费的时间并没有真正得到增强,这真的不起作用。然后我在python中阅读了GIL,我的问题是:如果GIL适用于所有人,为什么他们创建ThreadPoolExecutor.map,或者有没有更好的想法使用ThreadPoolExecutor.map

请找一个我用来理解这个过程的例子。我很高兴听到有关如何将多线程用于迭代器而不是多进程的建议,因为我的内存卡和 CPU 不是那么高。

import concurrent.futures
import math

PRIMES = [
    112272535095293,
    112582705942171,
    112272535095293,
    115280095190773,
    115797848077099,
    1099726899285419]

def is_prime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False

    sqrt_n = int(math.floor(math.sqrt(n)))
    for i in range(3, sqrt_n + 1, 2):
        if n % i == 0:
            return False
    return True

def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers = 4) as executor:
        future= executor.map(is_prime, PRIMES)

    print(future.result())

if __name__ == '__main__':
    main()

【问题讨论】:

  • python 中的多线程在大多数情况下仅在涉及大量阻塞 I/O 操作(即网络爬虫)时才能提高效率。
  • 非常感谢。似乎在 python 中使用线程不是一个好主意

标签: python python-multithreading threadpoolexecutor


【解决方案1】:

正如您所指出的,GIL 意味着一次只能使用 1 个 CPU,并且只有 1 个“真实”线程。所以使用线程池不会加速 CPU 密集型代码。但是,如果标准库和其他 3rd 方库中的许多函数在 I/O 上被阻塞,它们将自动释放 GIL

例如,如果您的代码尝试从 Internet 下载大量内容,您可以使用 Python 线程池。当一个线程请求下载某些东西并等待响应时,它可以(取决于您用来发出 HTTP 请求的库)释放 GIL 并让另一个线程有机会运行。这意味着您可以在其中任何一个完成之前发出许多请求,然后每个 Python 线程将在它们的响应可用时再次被唤醒。这种 Python 多线程可以带来巨大的性能提升。

【讨论】:

  • 谢谢。我相信阅读这意味着在我的情况下主要是数值计算,使用线程不起作用。我将寻找另一种方法,我读到 cython 可以在多线程效率下工作。所以,我将阅读 cython 如何做到这一点
  • python 中的异步怎么样,它可以用于数值计算还是仅用于 Web?
  • 当你调用一个用 C 语言编写的函数时,C 代码可以产生“真正的线程”并利用多个 CPU。这就是“cython 可以在多个线程中工作”的方式,但要利用这一点,您必须编写一些 C 代码,然后使其可用于 Python。 Python 的异步功能可以用于数值计算,但它仍然具有 GIL,并且仍然只为 Python 代码使用单个 CPU(如前所述 - 用 C 实现的函数始终可以是多线程的)。
  • 这么多.. 显然即使是低级的javascript 也做得更好,因为它的核心库在 C 级别是多线程的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多