ThreadPool
和multiprocessing
模块中的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
的官方文档,有人能帮我找到它吗?
1条答案
按热度按时间zbq4xfa01#
multiprocessing.pool.ThreadPool
的行为与multiprocessing.Pool
相同,唯一的区别是使用线程而不是进程来运行worker逻辑。你之所以看到
使用
multiprocessing.Pool
多次打印是因为池将产生5个独立的进程,每个进程将初始化自己的Python解释器并加载模块,导致顶层print
再次执行。请注意,仅当使用
spawn
进程创建方法时才会发生这种情况(仅Windows上可用的方法)。如果您使用fork
进程创建方法(Unix),您将看到该消息仅针对线程打印一次。multiprocessing.pool.ThreadPool
没有文档记录,因为它的实现从未完成。它缺乏测试和文档。你可以在源代码中看到它的实现。我相信下一个自然的问题是:何时使用基于线程的池,何时使用基于进程的池?
经验法则是:
multiprocessing.pool.ThreadPool
multiprocessing.Pool
multiprocessing.Pool
在Python 3中,你可能想看看
concurrent.future.Executor
池的实现。