如何在python中并行运行一个函数?
How to run a function parallelly in python?
我有下面的函数测试
import concurrent.futures
from multiprocessing import Pool
def Test(n):
print(n)
我想运行并行,所以我这样做
li = ['a','b', 'c']
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(Test, li )
但我没有看到输出,即打印 a、b、c
我正在 运行在 Jupyter notebook 上使用它。不确定这是否是问题所在。我没有看到任何输出。尽管如果我单独调用测试函数,它 运行 没问题。
我在 运行Windows OS
我通常会就此作为 this question 的副本发表接近投票,但现在我们终于确定您 运行 在 Windows 下,您有两个您的代码有问题。
- 您需要从外部文件导入辅助函数
Test
才能成功使用 Jupyter Notebook 进行多处理。但是多处理代码最好来自 Jupyter Notebook not 运行 因为这种复杂性,也因为通常会捕获并写入单元格下方的子进程的终端输出被写入Jupyter Notebook 日志记录 window(见下文)。
- 在使用 OS spawn 方法启动新进程的平台上,例如 Windows,您必须将任何创建新进程的代码包含在
if __name__ == '__main__':
块。事实上,您应该将您的工作函数不需要的任何全局范围内的代码放在这样的块中以提高效率,否则池中的每个进程都会在其初始化过程中不必要地执行它。
文件 test.py 在与您的 .ipynb 文件相同的目录中
def Test(n):
print(n)
还有你的手机
if __name__ == '__main__':
from test import Test
import concurrent.futures
li = ['a','b', 'c']
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(Test, li )
这是 Jupyter Notebook 日志记录的输出 window(这里我实际上通常使用 Jupyter Lab,它建立在 Jupyter Notebook 之上):
[I 06:08:25.599 LabApp] JupyterLab extension loaded from c:\program files\python38\lib\site-packages\jupyterlab
[I 06:08:25.600 LabApp] JupyterLab application directory is c:\program files\python38\share\jupyter\lab
[I 06:08:25.702 LabApp] Serving notebooks from local directory: C:\Booboo\test
[I 06:08:25.703 LabApp] Jupyter Notebook 6.1.5 is running at:
[I 06:08:25.706 LabApp] http://localhost:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
[I 06:08:25.706 LabApp] or http://127.0.0.1:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
[I 06:08:25.707 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 06:08:26.082 LabApp]
To access the notebook, open this file in a browser:
file:///C:/Users/Booboo/AppData/Roaming/jupyter/runtime/nbserver-13472-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
or http://127.0.0.1:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
[I 06:08:39.827 LabApp] Build is up to date
[I 06:08:58.745 LabApp] Kernel started: bac1f587-2c31-45e5-b1ca-7f56dd1929ba, name: python3
a
c
b
如果 Test
改为:
def Test(n):
return n * n
还有你的手机:
if __name__ == '__main__':
from test import Test
import concurrent.futures
li = [1, 2, 3]
with concurrent.futures.ProcessPoolExecutor() as executor:
print(list(executor.map(Test, li)))
然后打印将由您的主进程完成,您会看到单元格下方的输出。
你有机会也应该看看PEP 8 – Style Guide for Python Code。函数名通常不以大写字母开头。
我有下面的函数测试
import concurrent.futures
from multiprocessing import Pool
def Test(n):
print(n)
我想运行并行,所以我这样做
li = ['a','b', 'c']
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(Test, li )
但我没有看到输出,即打印 a、b、c
我正在 运行在 Jupyter notebook 上使用它。不确定这是否是问题所在。我没有看到任何输出。尽管如果我单独调用测试函数,它 运行 没问题。
我在 运行Windows OS
我通常会就此作为 this question 的副本发表接近投票,但现在我们终于确定您 运行 在 Windows 下,您有两个您的代码有问题。
- 您需要从外部文件导入辅助函数
Test
才能成功使用 Jupyter Notebook 进行多处理。但是多处理代码最好来自 Jupyter Notebook not 运行 因为这种复杂性,也因为通常会捕获并写入单元格下方的子进程的终端输出被写入Jupyter Notebook 日志记录 window(见下文)。 - 在使用 OS spawn 方法启动新进程的平台上,例如 Windows,您必须将任何创建新进程的代码包含在
if __name__ == '__main__':
块。事实上,您应该将您的工作函数不需要的任何全局范围内的代码放在这样的块中以提高效率,否则池中的每个进程都会在其初始化过程中不必要地执行它。
文件 test.py 在与您的 .ipynb 文件相同的目录中
def Test(n):
print(n)
还有你的手机
if __name__ == '__main__':
from test import Test
import concurrent.futures
li = ['a','b', 'c']
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(Test, li )
这是 Jupyter Notebook 日志记录的输出 window(这里我实际上通常使用 Jupyter Lab,它建立在 Jupyter Notebook 之上):
[I 06:08:25.599 LabApp] JupyterLab extension loaded from c:\program files\python38\lib\site-packages\jupyterlab
[I 06:08:25.600 LabApp] JupyterLab application directory is c:\program files\python38\share\jupyter\lab
[I 06:08:25.702 LabApp] Serving notebooks from local directory: C:\Booboo\test
[I 06:08:25.703 LabApp] Jupyter Notebook 6.1.5 is running at:
[I 06:08:25.706 LabApp] http://localhost:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
[I 06:08:25.706 LabApp] or http://127.0.0.1:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
[I 06:08:25.707 LabApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 06:08:26.082 LabApp]
To access the notebook, open this file in a browser:
file:///C:/Users/Booboo/AppData/Roaming/jupyter/runtime/nbserver-13472-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
or http://127.0.0.1:8888/?token=156f2a52135726b662215b349b4047dfea557c17d1acb366
[I 06:08:39.827 LabApp] Build is up to date
[I 06:08:58.745 LabApp] Kernel started: bac1f587-2c31-45e5-b1ca-7f56dd1929ba, name: python3
a
c
b
如果 Test
改为:
def Test(n):
return n * n
还有你的手机:
if __name__ == '__main__':
from test import Test
import concurrent.futures
li = [1, 2, 3]
with concurrent.futures.ProcessPoolExecutor() as executor:
print(list(executor.map(Test, li)))
然后打印将由您的主进程完成,您会看到单元格下方的输出。
你有机会也应该看看PEP 8 – Style Guide for Python Code。函数名通常不以大写字母开头。