请告诉我之间的差异ThreadPool,并Pool在multiprocessing模块。当我尝试代码时,这是我看到的主要区别:
ThreadPool
Pool
multiprocessing
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]
使用“ ThreadPool”:
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]
我的问题是:
为何每次在__main __()外运行Pool?
multiprocessing.pool.ThreadPool没有产生新的进程?它只是创建新线程?
multiprocessing.pool.ThreadPool
如果是这样,使用multiprocessing.pool.ThreadPool与仅使用threading模块之间有什么区别?
threading
我在任何ThreadPool地方都没有看到任何官方文档,有人可以在哪里找到我吗?
该multiprocessing.pool.ThreadPool行为一样multiprocessing.Pool,唯一的区别在于使用线程,而不是进程运行的工人逻辑。
multiprocessing.Pool
你看到的原因
hi outside of main()
会被多次打印multiprocessing.Pool是由于该池将生成5个独立的进程。每个进程将初始化其自己的Python解释器并加载模块,从而导致print再次执行顶层。
print
请注意,仅当使用spawn进程创建方法时才会发生这种情况(Windows上仅此方法可用)。如果使用fork一个(Unix),则与线程一样,该消息仅打印一次。
spawn
fork
将multiprocessing.pool.ThreadPool作为其实现从未完成未记录。它缺少测试和文档。您可以在源代码中看到其实现。
我相信下一个自然的问题是:何时使用基于线程的池,何时使用基于进程的池?
经验法则是:
在Python 3上,您可能需要看一下concurrent.future.Executor池的实现。
concurrent.future.Executor