【发布时间】:2020-02-07 09:24:46
【问题描述】:
背景:我正在尝试使用 python-dymola 界面进行 100 次 dymola 模拟。我设法在 for 循环中运行它们。现在我希望它们在多线程时运行,这样我就可以并行运行多个模型(这会快得多)。由于可能没有人使用该界面,因此我编写了一些简单的代码,也显示了我的问题:
1:将 for 循环转换为运行到另一个 for 循环中的定义,但 def 和 for 循环共享相同的变量 'i'。
2:将for循环变成定义,使用多线程来执行。 for 循环一个一个地运行命令。我想同时使用最多 x 个线程并行运行它们。结果应该和执行for循环时一样
示例代码:
import os
nSim = 100
ndig='{:01d}'
for i in range(nSim):
os.makedirs(str(ndig.format(i)))
请注意,创建的目录的名称只是 for 循环中的数字(这很重要)。现在,我不想使用 for 循环,而是喜欢使用多线程创建目录(注意:对于这个简短的代码可能不感兴趣,但是当调用和执行 100 个模拟模型时,使用多线程肯定很有趣。线程)。
所以我从我认为的一些简单的事情开始,将 for 循环转换为一个函数,然后在另一个 for 循环中运行,并希望得到与上面的 for 循环代码相同的结果,但得到了这个错误: AttributeError: 'NoneType' 对象没有属性 'start' (注:我是从这个开始的,因为我之前没有使用def-statement,而且线程包也是新的。之后我会向多线程发展。)
1:
import os
nSim = 100
ndig='{:01d}'
def simulation(i):
os.makedirs(str(ndig.format(i)))
for i in range(nSim):
simulation(i=i).start
在那次失败之后,我尝试进化到多线程(将 for 循环转换为具有相同功能但使用多线程的东西,并通过并行运行代码而不是一个一个地运行代码,并且最大数量线程):
2:
import os
import threading
nSim = 100
ndig='{:01d}'
def simulation(i):
os.makedirs(str(ndig.format(i)))
if __name__ == '__main__':
i in range(nSim)
simulation_thread[i] = threading.Thread(target=simulation(i=i))
simulation_thread[i].daemon = True
simulation_thread[i].start()
不幸的是,该尝试也失败了,现在我得到了错误: NameError: name 'i' is not defined
有人对问题 1 或 2 有建议吗?
【问题讨论】:
标签: python multithreading function for-loop