python-3.x 在多处理模块中,ThreadPool与Pool有什么区别?

rvpgvaaj  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(153)

ThreadPoolmultiprocessing模块中的Pool有什么区别?当我试用我的代码时,这是我看到的主要区别:

from multiprocessing import Pool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = Pool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

我看到以下输出:

hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
inside hello()
Proccess id:  13268
inside hello()
Proccess id:  11104
inside hello()
Proccess id:  13064
[0, 1, 4]

使用"线程池":

from multiprocessing.pool import ThreadPool
import os, time

print("hi outside of main()")

def hello(x):
    print("inside hello()")
    print("Proccess id: ", os.getpid())
    time.sleep(3)
    return x*x

if __name__ == "__main__":
    p = ThreadPool(5)
    pool_output = p.map(hello, range(3))

    print(pool_output)

我看到以下输出:

hi outside of main()
inside hello()
inside hello()
Proccess id:  15204
Proccess id:  15204
inside hello()
Proccess id:  15204
[0, 1, 4]

我的问题是:

  • 为什么Pool中每次都运行"outside__main__()"?
  • multiprocessing.pool.ThreadPool不产生新进程?它只是创建新线程?
  • 如果是这样,使用multiprocessing.pool.ThreadPool模块与仅使用threading模块有什么区别?

我在任何地方都没有看到任何ThreadPool的官方文档,有人能帮我找到它吗?

zbq4xfa0

zbq4xfa01#

multiprocessing.pool.ThreadPool的行为与multiprocessing.Pool相同,唯一的区别是使用线程而不是进程来运行worker逻辑。
你之所以看到

hi outside of main()

使用multiprocessing.Pool多次打印是因为池将产生5个独立的进程,每个进程将初始化自己的Python解释器并加载模块,导致顶层print再次执行。
请注意,仅当使用spawn进程创建方法时才会发生这种情况(仅Windows上可用的方法)。如果您使用fork进程创建方法(Unix),您将看到该消息仅针对线程打印一次。
multiprocessing.pool.ThreadPool没有文档记录,因为它的实现从未完成。它缺乏测试和文档。你可以在源代码中看到它的实现。
我相信下一个自然的问题是:何时使用基于线程的池,何时使用基于进程的池?
经验法则是:

  • 受IO限制的作业-〉multiprocessing.pool.ThreadPool
  • CPU密集型作业-〉multiprocessing.Pool
  • 混合作业-〉取决于工作负载,由于进程隔离带来的优势,我通常更喜欢multiprocessing.Pool

在Python 3中,你可能想看看concurrent.future.Executor池的实现。

相关问题