【问题标题】:Caveats to be aware of when using threading in Python?在 Python 中使用线程时需要注意的事项?
【发布时间】:2010-05-30 11:29:14
【问题描述】:

我对 Python 中的线程非常陌生,并且有几个初学者问题。

当使用 Python threading 模块启动超过 50 个线程时,我开始收到 MemoryError。线程本身非常纤细,而且内存消耗量不大,因此似乎是线程的开销导致了内存问题。

  • 我可以做些什么来增加内存容量或以其他方式使 Python 允许更多的线程?
  • 使用threading 模块,您可以在 Python 代码中运行的最大线程数是多少?你有没有采取什么技巧来达到这个数字?
  • 在使用threading 模块时是否还有其他注意事项需要注意?

【问题讨论】:

  • 你的电脑有多少内存?
  • 通常您希望尽可能少的线程。听起来您认为自己想要尽可能多地
  • THC4k:您在问题中的哪个地方得到了这样的印象?所需的线程数显然是问题域的函数。

标签: python multithreading


【解决方案1】:

您的问题无法笼统地回答,因为线程的良好使用始终取决于要解决的具体问题。您也没有告诉我们您使用的是哪个 Python 版本,所以我假设您使用“默认”CPython 而不是 IronPython 或类似的东西。给你一些提示和想法来进一步思考你的问题:

  • 为什么需要这么多胎面?无论如何,您的机器可能无法并行运行它们。
  • 看看 Stackless Python。不知道该项目的现状,但我认为它是为此类问题而设计的。
  • 全局解释器锁可防止纯 Python 代码真正并行运行。但是 C 方法可以并行运行,因此在现实生活中有时很难猜测 Python 在并行化方面的表现。
  • Python 有很多好的库。看看其中一个是否已经为您的设计问题提供了解决方案。如果您的问题与网络相关,请查看 Twisted 示例。

【讨论】:

    【解决方案2】:

    众所周知,Global Interpreter Lock 对标准 CPython 的性能限制有很大影响。因此multiprocessing module 注释:

    multiprocessing 是一个包 支持使用 API 类似于 threading 模块。 多处理包提供 本地和远程并发, 有效地回避全球 使用子进程的解释器锁 而不是线程。正因为如此, 多处理模块允许 程序员充分利用多个 给定机器上的处理器。它运行 在 Unix 和 Windows 上。

    GIL 可能不是导致 MemoryErrors 的原因,但需要注意。

    【讨论】:

      【解决方案3】:

      Eventlets-线程专为低内存消耗而设计。 通用调用 spawn 可以轻松用于生成新线程。

      【讨论】:

      • 还可以看看 gevent,它是为修复一些 Eventlet 的错误而构建的,并且具有更好的性能。
      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多