如何中断多线程池以调用短函数

时间:2015-01-20 16:43:09

标签: python multithreading python-multithreading

在我的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();

我对此感到非常感谢。

1 个答案:

答案 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()