我试图创建与我的脚本并行运行使用多处理的情节。我在这里为我的问题创建了两个示例脚本,因为包含计算部分的实际主脚本太长了。在www.example.com中script0.py你可以看到多处理部分,在那里我启动了实际的script1.py,并行地做了4次。在这个例子中,它只是创建一些随机散点图。
script0.py:
import multiprocessing as mp
import os
def execute(process):
os.system(f"python {process}")
if __name__ == "__main__":
proc_num = 4
process= []
for _ in range(proc_num):
process.append("script1.py")
process_pool = mp.Pool(processes= proc_num)
process_pool.map(execute, process)
script1.py:
#just a random scatterplot, but works for my example
import time
import numpy as np
import matplotlib.pyplot as plt
import os
dir_name = "stackoverflow_question"
plot_name = time.strftime("Plot %Hh%Mm%Ss") #note the time.strftime() function
if not os.path.exists(f"{dir_name}"):
os.mkdir(f"{dir_name}")
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2
plt.scatter(x,y, s=area, c=colors, alpha=0.5)
#plt.show()
plt.savefig(f"{dir_name}/{plot_name}", dpi = 300)
重要的是,我以创作时间来命名这个情节
plot_name = time.strftime(“Plot %Hh%Mm%Ss”)
这就创建了一个类似“Plot 16 h39 m22 s”的字符串。到目前为止一切顺利。。现在来谈谈我的实际问题!我意识到,当并行启动进程时,有时绘图名称是相同的,因为time.strftime()创建的时间戳是相同的,因此可能会发生www.example.com的一个示例script1.py覆盖另一个示例已经创建的绘图。
在我的工作脚本中,我有这个确切的问题,我生成了很多数据,因此我需要根据它们生成的日期和时间来命名我的图和CSV。
我已经想过在www.example.com被调用时给它一个变量script1.py,但我不知道如何实现,因为我刚刚了解了多处理库。但这个变量也必须变化,否则我会遇到同样的问题。
有没有人有一个更好的主意,我如何才能实现这一点?先谢谢你了。
2条答案
按热度按时间yftpprvb1#
我提出这些方法:
xjreopfe2#
一些想法...
首先,您没有遵循
multiprocessing
模块中关于如何使用Pool
的指导原则。您应该将其放在上下文管理器with(...)...
中有很多例子。请参见DOX中的红色警告:
https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool
另外,使用
os.system
调用有点奇怪/不安全。为什么不把绘图例程放到同一个模块或不同模块的标准函数中,然后导入它呢?这将允许你传递额外的信息(比如一个好的标签)给函数。我希望像这样的东西,其中source
是一个内存或外部源...就标签而言,如果你在同一个“秒”内启动这些进程,当然会有重叠,所以你可以在标签上附加进程号,或者其他一些信息,比如来自数据源的信息,或者使用相同的时间戳,但是把输出放在唯一的文件夹中,就像另一个答案中建议的那样。
我觉得这样的事...
编码:
输出: