多处理 "Pool" 在 运行 程序上挂起
Multiprocessing "Pool" hangs on running program
我已经编写了一个程序来使用来自 multiprocessing python 包的 "Pool",但它一直挂起内核。(顺便说一句,我正在使用 Jupyter 和 Anaconda)
我尝试使用像 "math" 这样的导入包中的函数,它工作得很好,但是,当我使用我在同一个 python 文件中创建的函数时,它不起作用。
import multiprocessing as mp
def f(x):
for i in x:
return i+1
ar=[1,2,3,4,5]
def main():
pool=mp.Pool(processes=4)
pool.map(f,ar)
if __name__== '__main__':
main()
它表明内核正在工作,但 cpu 使用率为 0%。
问题是 ar
不在你的 main 函数的本地范围内,它在它之上。把它放在里面,它应该可以工作。
from multiprocessing import Pool
def f(x):
return x+1
if __name__ == '__main__':
ar=[1,2,3,4,5]
with Pool(4) as p:
print(p.map(f, ar))
还要考虑 map
正在获取您的可迭代对象并跨进程分配它,本质上它正在为您执行 for
循环。因此,您可以直接访问 x。
最后,使用 with
作为上下文管理器可确保您的 Pool 在完成时关闭。 [docs]
编辑: 我编辑并测试了上面的代码,我的代码发送了正确的值并正常关闭。
此代码在 Spyder 3.2.6 和标准终端中也适用于我。两个片段都正确关闭并且不会挂在我的机器上。
import multiprocessing as mp
def f(x):
return x+1
def main():
ar = [1,2,3,4,5]
pool = mp.Pool(processes=4)
print(pool.map(f, ar))
if __name__ == '__main__':
main()
我已经编写了一个程序来使用来自 multiprocessing python 包的 "Pool",但它一直挂起内核。(顺便说一句,我正在使用 Jupyter 和 Anaconda)
我尝试使用像 "math" 这样的导入包中的函数,它工作得很好,但是,当我使用我在同一个 python 文件中创建的函数时,它不起作用。
import multiprocessing as mp
def f(x):
for i in x:
return i+1
ar=[1,2,3,4,5]
def main():
pool=mp.Pool(processes=4)
pool.map(f,ar)
if __name__== '__main__':
main()
它表明内核正在工作,但 cpu 使用率为 0%。
问题是 ar
不在你的 main 函数的本地范围内,它在它之上。把它放在里面,它应该可以工作。
from multiprocessing import Pool
def f(x):
return x+1
if __name__ == '__main__':
ar=[1,2,3,4,5]
with Pool(4) as p:
print(p.map(f, ar))
还要考虑 map
正在获取您的可迭代对象并跨进程分配它,本质上它正在为您执行 for
循环。因此,您可以直接访问 x。
最后,使用 with
作为上下文管理器可确保您的 Pool 在完成时关闭。 [docs]
编辑: 我编辑并测试了上面的代码,我的代码发送了正确的值并正常关闭。
此代码在 Spyder 3.2.6 和标准终端中也适用于我。两个片段都正确关闭并且不会挂在我的机器上。
import multiprocessing as mp
def f(x):
return x+1
def main():
ar = [1,2,3,4,5]
pool = mp.Pool(processes=4)
print(pool.map(f, ar))
if __name__ == '__main__':
main()