gpt4 book ai didi

python - 最大线程限制实际上是 Python/Linux 的不相关问题吗?

转载 作者:太空狗 更新时间:2023-10-29 17:06:25 24 4
gpt4 key购买 nike

我正在处理的当前 Python 应用程序需要使用 1000 多个线程(Python 线程模块)。并不是说任何单个线程都以最大 CPU 周期工作,这只是我正在创建的 Web 服务器负载测试应用程序。 IE。模拟 200 个 firefox 客户端,它们都渴望进入网络服务器并下载小型网络组件,基本上模拟了在几秒钟而不是几微秒内操作的人类。

所以,我正在阅读各种主题,例如“python 在 Linux/windows 上支持多少线程等”,我看到了很多不同的答案。一个用户说它都是关于内存和默认的 Linux 内核只为线程预留 8Meg,如果超过该值,则线程开始被内核杀死。

有人说这对 CPython 来说不是问题,因为无论如何一次只有 1 个线程在运行(因为 GIL)所以我们可以指定大量线程???这件事的真相是什么?

最佳答案

  1. “由于 GIL,一个线程一次运行。”好吧,有点。 GIL 意味着一次只有一个线程可以执行 Python 代码。但是,任何数量的线程都可以执行 IO、各种其他系统调用或其他不包含 GIL 的代码。

    听起来您的线程将主要执行网络 I/O,并且任意数量的线程都可以同时执行 I/O。拥有 1000 个线程的 GIL 竞争可能非常激烈,但您始终可以创建多个 Python 进程并在它们之间划分 I/O 线程(即,在开始之前多次fork)。

  2. “默认情况下,Linux 内核仅为线程留出 8Meg。”我不确定你是从哪里听说的。也许您实际听到的是“在 Linux 上,默认堆栈大小通常为 8 MiB”,这是事实。每个线程将使用 8 MiB 的地址空间用于堆栈(在 64 位上没有问题)加上内核资源用于额外的内存映射和线程进程本身。您可以使用 threading.stack_size 库函数更改堆栈大小,如果您有很多不进行深度调用的线程,这会有所帮助。

    >>> import threading
    >>> threading.stack_size()
    0 # platform default, probably 8 MiB
    >>> threading.stack_size(64*1024) # 64 KiB stack size for future threads
  3. 此线程中的其他人建议使用异步/非阻塞框架。好吧,你可以做到。然而,在现代 Linux 内核上,多线程模型与异步(select/poll/epoll)I/O 多路复用技术竞争。重写您的代码以使用异步模型是一项非常重要的工作,因此只有当我无法从线程模型获得所需的性能时,我才会这样做。如果您的线程真的试图模拟人类延迟(例如,大部分时间都在 sleep ),那么在很多情况下,异步方法实际上更慢。我不确定这是否适用于 Python,仅减少 GIL 争用就值得进行转换。

关于python - 最大线程限制实际上是 Python/Linux 的不相关问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10344529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com