当我调用 process.start() 时,Python 多处理进程只会停止我的代码运行

Posted

技术标签:

【中文标题】当我调用 process.start() 时,Python 多处理进程只会停止我的代码运行【英文标题】:Python multiprocessing process just stops my code of running when i call process.start() 【发布时间】:2021-11-22 16:51:19 【问题描述】:

我试图让遗传算法使用多处理并行运行候选者。所以我做了这样的代码

import multiprocessing as mp

...

parents = []
queue = mp.Queue(maxsize=poolSize - 1)
processes = []
for _ in range(poolSize - 1):
    processes.append(mp.Process(target=generate_parent, args=(queue,)))
for process in processes:
    process.start()
for process in processes:
    process.join()
for _ in range(poolSize - 1):
    parents.append(queue.get())

出了点问题,我只是不知道是什么。当我尝试调试当它到达“process.start()”时看到的代码时,执行就像它已经到达“while True: continue”一样停止。当我尝试正常执行它时也会发生同样的情况,代码会卡在某个点,但它不会停止进程或引发任何错误。

我是多处理和一般并行性方面的新手,如果有人可以帮助我,我会很高兴。

整个代码在这里: https://github.com/estevaopbs/Molpro_tools

这个特定的问题在generic.py 第144 行。 (我知道代码中还有一些其他问题。我正在解决它,它们不应该影响这个特定问题。)

【问题讨论】:

您的主进程必须在加入子进程之前执行queue.get 操作。阅读multiprocessing.Queue上的文档仔细 【参考方案1】:

看起来问题就在这里(如果不是,它仍然是一个麻烦点):

    def fn_generate_parent(queue=None):
        while True:
            try:
                parent = Chromosome()
                parent.Genes = create_lookup[random.choices(create_methods.methods, create_methods.rate)[0]]\
                    (first_molecule)
                parent.Fitness = get_fitness(parent.Genes, fitness_param, threads_per_calculation)
                break
            except:
                os.remove(f'data/parent.Genes.__hash__().inp')
                os.remove(f'data/parent.Genes.__hash__().out')
                os.remove(f'data/parent.Genes.__hash__().xml')
                continue

如果 try 块中存在异常 - 未声明的变量、未知方法、除以 0 - while True 继续作为无声无限循环。

问题在于,如果出现问题,代码不会采取任何纠正措施或停止,它只是静静地继续,并可能不断遇到相同的错误。我会删除 continue 或至少添加一些错误消息、日志记录或可能只重试几次的计数器。

【讨论】:

我将在没有 try/except 语句的情况下对其进行测试,然后我会带回我得到的结果。 你是对的,谢谢。现在我可以尝试解决它。​​

以上是关于当我调用 process.start() 时,Python 多处理进程只会停止我的代码运行的主要内容,如果未能解决你的问题,请参考以下文章

为什么Python multiprocess.Process调用在应用程序中启动多个self实例?

安装程序在使用 Process.Start() 启动时失败,但在双击时工作

从 Windows 服务调用时 Process.Start 不起作用

System.Diagnostics.Process.Start() 从 Windows 服务调用时无法启动进程

Process.Start() 啥都不做

调用process.start时为什么StartInfo.stuff不起作用但Process.start在C#中工作正常