【问题标题】:Maximum pool size when using ThreadPool Python使用 ThreadPool Python 时的最大池大小
【发布时间】:2017-07-21 09:07:42
【问题描述】:

我正在使用 ThreadPool 来实现多处理。使用多处理时,池大小限制应等于 CPU 内核数。 我的问题- 使用 ThreadPool 时,池大小限制应该是 CPU 内核数吗?

这是我的代码

from multiprocessing.pool import ThreadPool as Pool
class Subject():
    def __init__(self, url):
       #rest of the code
   def func1(self):
      #returns something
if __name__=="__main__":
   pool_size= 11
   pool= Pool(pool_size)
   objects= [Subject() for url in all_my_urls]
   for obj in objects:
     pool.apply_async(obj.func1, ())
   pool.close()
   pool.join()

最大池大小应该是多少? 提前致谢。

【问题讨论】:

    标签: python threadpool


    【解决方案1】:

    你不能使用线程进行多处理,你只能实现多线程。由于 GIL,多个线程不能在单个 Python 进程中同时运行,因此多线程仅在它们运行 IO 繁重的工作(例如与 Internet 通信)时才有用,在这些工作中他们花费大量时间等待,而不是 CPU 繁重的工作(例如数学),它不断占据核心。

    因此,如果您同时运行许多 IO 繁重的任务,那么拥有那么多线程将很有用,即使它超过了 CPU 内核的数量。大量线程最终会对性能产生负面影响,但在您实际测量问题之前不要担心。 100 个线程应该没问题。

    【讨论】:

    • OP 已经在使用multiprocessing 模块,它只是模仿multithreading
    • multiprocessing 中的 ThreadPool 并不是真正的多处理,它只是为了匹配使用实际进程的通常 Pool 的 API。
    • 我认为你是对的 (+1)。它似乎没有记录,我将它与 Pool 混淆了。
    • 抱歉懒惰的争论
    • @PranitiGupta 是的,我弄错了。
    【解决方案2】:

    不,您不必将线程池大小限制为与 CPU 内核数相同。如果你在 IO 高吞吐量的情况下使用它,你可以将你的线程池大小调整到一个合适的数字,这有助于你获得最高的 IO 吞吐量,如果增加线程数,你将无法获得更高的 IO 吞吐量数。

    (我发现我可以为threadpool设置的最大线程数只有9000左右,如果更高,Python3.6会报错,谷歌让我访问你的问题)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2017-01-28
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多