jupter notebook中多线程提高for循环效率报错

#求帮助#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("运行完成")


这样,在代码块运行完毕后,你应该能够看到"运行完成"的输出。同时,你可以在文件系统中检查结果文件夹,确保结果文件夹中有预期的结果生成。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1083120
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:jupter notebook用清华镜像安装、更新库
  • 除此之外, 这篇博客: Jupter notebook 常用配置中的 主题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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