#求帮助#jupter notebook中多线程提高for循环效率报错#运行了以下代码后,总会报错这个,请问如何解决这个问题呢?
Traceback (most recent call last):
File "D:\anaconda3\lib\multiprocessing\process.py", line 314, in _bootstrap
self.run()
File "D:\anaconda3\lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "D:\anaconda3\lib\multiprocessing\pool.py", line 114, in worker
task = get()
File "D:\anaconda3\lib\multiprocessing\queues.py", line 367, in get
return _ForkingPickler.loads(res)
AttributeError: Can't get attribute 'process_parameters' on <module '__main__' (built-in)>
import pandas as pd
import os
from multiprocessing import Pool
# 读取 Excel 文件
dI = pd.read_excel('F:\测试\I.xlsx')
dD = pd.read_excel('F:\测试\D.xlsx')
# 获取某一列的数据并转化为列表-定义变量I和D的取值列表
I_list = dI['强度'].tolist()
D_list = dD['时间'].tolist()
print(I_list)
print(D_list)
def process_parameters(I, D):
for I in I_list:
for D in D_list:
folder_name = f"测试{I}-{D}"
os.makedirs(os.path.join("F:\\测试\\测试文件", folder_name))
os.system(f"xcopy /E /I \"F:\\测试\\模型模板10m\" \"F:\\测试\\测试文件\\{folder_name}\"")
def run_multiprocess():
with Pool(processes=8) as pool:
parameter_list = [(I, D) for I in I_list for D in D_list]
pool.starmap(process_parameters, parameter_list)
if __name__ == '__main__':
run_multiprocess()
又或者是下面这种点击了显示正在运行,但文件夹中始终没有结果
import pandas as pd
import os
from multiprocessing import Pool
# 读取 Excel 文件
dI = pd.read_excel('F:\测试\I.xlsx')
dD = pd.read_excel('F:\测试\D.xlsx')
# 获取某一列的数据并转化为列表-定义变量I和D的取值列表
I_list = dI['降雨强度'].tolist()
D_list = dD['持续时间'].tolist()
print(I_list)
print(D_list)
# 定义修改txt文件的函数
def modify_txt_file(file_path, a, b, value):
with open(file_path, "r+") as f:
lines = f.readlines()
line = lines[a-1].split()
line[b-1] = str(value)
lines[a-1] = " ".join(line) + "\n"
f.seek(0)
f.writelines(lines)
f.truncate()
# 定义运行A.exe文件的函数
def run_A_exe(folder_name, D):
input_file = os.path.join("F:\测试\测试文件\\", folder_name, "tpx_in.txt")
modify_txt_file(input_file, 6, 5, D * 3600)
modify_txt_file(input_file, 24, 2, D * 3600)
modify_txt_file(input_file, 70, 1, D * 3600)
line10 = f"{0.001 * I / 86400:.2e}"
modify_txt_file(input_file, 22, 1, line10)
os.chdir(os.path.join("F:\\测试\\测试文件\\", folder_name))
topoindex_file = os.path.join("F:\\测试\\测试文件\\", folder_name, "topoindex.exe")
os.system(topoindex_file)
# 定义运行B.exe文件的函数
def run_B_exe(folder_name):
os.chdir(os.path.join("F:\\测试\\测试文件\\", folder_name))
trigrs_file = os.path.join("F:\\测试\\测试文件\\", folder_name, "trigrs.exe")
os.system(trigrs_file)
# 定义处理单个参数组合的函数
def process_parameters(I, D):
folder_name = f"测试{I}-{D}"
os.makedirs(os.path.join("F:\\测试\\测试文件", folder_name))
os.system(f"xcopy /E /I \"F:\\测试\\TRIGRS模型模板10m\" \"F:\\测试\\测试文件\\{folder_name}\"")
run_A_exe(folder_name, D)
run_B_exe(folder_name)
# 定义启动多进程的函数
def run_multiprocess():
with Pool(processes=8) as pool:
parameter_list = [(I, D) for I in I_list for D in D_list]
pool.starmap(process_parameters, parameter_list)
if __name__ == '__main__':
run_multiprocess()
来自NewBing和LP的编写:
你试把process_parameters函数定义在主模块之外,并导入到主模块中使用。
import pandas as pd
import os
from multiprocessing import Pool
# 读取 Excel 文件
dI = pd.read_excel('F:\测试\I.xlsx')
dD = pd.read_excel('F:\测试\D.xlsx')
# 获取某一列的数据并转化为列表-定义变量I和D的取值列表
I_list = dI['强度'].tolist()
D_list = dD['时间'].tolist()
print(I_list)
print(D_list)
# 定义处理单个参数组合的函数
def process_parameters(I, D):
folder_name = f"测试{I}-{D}"
os.makedirs(os.path.join("F:\\测试\\测试文件", folder_name))
os.system(f"xcopy /E /I \"F:\\测试\\模型模板10m\" \"F:\\测试\\测试文件\\{folder_name}\"")
def run_multiprocess():
with Pool(processes=8) as pool:
parameter_list = [(I, D) for I in I_list for D in D_list]
pool.starmap(process_parameters, parameter_list)
if __name__ == '__main__':
run_multiprocess()
第二个报错,可能程序运行时间长,而Jupyter Notebook默认情况下在代码块运行过程中不会显示输出。可以试在代码块最后添加一个输出语句,例如print("运行完成"),以确保代码块执行完毕后能够输出结果。
import pandas as pd
import os
from multiprocessing import Pool
# 读取 Excel 文件
dI = pd.read_excel('F:\测试\I.xlsx')
dD = pd.read_excel('F:\测试\D.xlsx')
# 获取某一列的数据并转化为列表-定义变量I和D的取值列表
I_list = dI['降雨强度'].tolist()
D_list = dD['持续时间'].tolist()
print(I_list)
print(D_list)
# 定义修改txt文件的函数
# ...
# 定义运行A.exe文件的函数
# ...
# 定义运行B.exe文件的函数
# ...
# 定义处理单个参数组合的函数
def process_parameters(I, D):
# ...
# 定义启动多进程的函数
def run_multiprocess():
with Pool(processes=8) as pool:
parameter_list = [(I, D) for I in I_list for D in D_list]
pool.starmap(process_parameters, parameter_list)
if __name__ == '__main__':
run_multiprocess()
print("运行完成")
这样,在代码块运行完毕后,你应该能够看到"运行完成"的输出。同时,你可以在文件系统中检查结果文件夹,确保结果文件夹中有预期的结果生成。
conda install jupyterthemes
# list available themes
# onedork | grade3 | oceans16 | chesterish | monokai | solarizedl | solarizedd
jt -l
# select theme...
jt -t chesterish
或者
pip install jupyterthemes
# list available themes
# onedork | grade3 | oceans16 | chesterish | monokai | solarizedl | solarizedd
jt -l
# select theme...
jt -t chesterish