在我的python脚本中,我使用不同的输入参数多次调用函数。为此,我使用了pool.apply_async
的多线程,并在for中多次调用。但是,我想检查已创建了多少输出文件作为进度指示器。似乎一旦进程运行,我就无法随时启动此外部函数。
如何中断并询问“你好,让我们用FileCount()
检查文件数量?
这是我的代码:
def FileCount(path):
Path = os.getenv("HOME") + "/hbar_gshfs/" + path
list_dir = []
list_dir = os.listdir(Path)
count = 0
for file in list_dir:
if file.endswith('.root'):
count += 1
return count
main()
if args.run:
mkdir_p(args.outdir)
pool=Pool(10)
for n in reversed(qnumbers):
for pos in positions:
for temp in temperatures:
for fmap in BFieldmap:
for fseek in fieldSeek:
for lH, uH in zip(lowerHysteresis,upperHysteresis):
if BFieldmap.index(fmap) !=positions.index(pos):
continue
pool.apply_async(g4Run,args=(paramToOutputName(args.macrodir,temp, n, pos, fmap, fseek, lH, uH),))
pool.close();
pool.join();
我对此感到非常感谢。
答案 0 :(得分:0)
为什么不呢?您的FileCount
函数返回创建的文件数,但未完全填写并填充数据(假设g4Run
在初始化中创建一个文件,然后继续填充它数据)。但它应该足够简单的进度指标。
否则您可以使用multiprocessing.Value
。将其作为附加参数传递给每个g4Run
,并在完成其工作后将g4Run
增加1。
要定期拨打FileCount
,您可以使用Pool.map_async
电话。为了将你的循环变换为生成器:
def generate_params():
for n in reversed(qnumbers):
for pos in positions:
for temp in temperatures:
for fmap in BFieldmap:
for fseek in fieldSeek:
for lH, uH in zip(lowerHysteresis,upperHysteresis):
if BFieldmap.index(fmap) !=positions.index(pos):
continue
yield paramToOutputName(args.macrodir,temp, n, pos, fmap, fseek, lH, uH)
async_result = pool.map_async(g4Run, generate_params())
pool.close()
while not async_result.ready():
async_result.wait(1) # Wait 1 second
# Call FileCount here and output progress
pool.join()