如何将多进程更改为单进程

Posted

技术标签:

【中文标题】如何将多进程更改为单进程【英文标题】:How to change multiprocess to single process 【发布时间】:2021-11-09 08:25:05 【问题描述】:

这是一些代码

如何将当前的多进程部分改为单进程?

import multiprocessing

def process(self):
    if product != 0:
        if self.mlist.check(file_dictionary):
            self.mlist.patch(file_dictionary)
            process = multiprocessing.Process(target = self.mlist.job, args = (file_dictionary, targ))
            self.multiprocess_list.append(process)
            process.start()

def wait(self):
    process_list = self.multiprocess_list
    for i in process_list:
        i.join(2)

【问题讨论】:

不用process = multiprocessing.Process(target = self.mlist.job, args = (file_dictionary, targ)),直接调用self.mlist.job(file_dictionary, targ)即可。但是,现在无论需要多长时间,您都将阻塞直到函数返回。 【参考方案1】:

下一次,请提供一个最小的可重现示例,如下所示:

import multiprocessing


def doSomething(k: str, v: int):
    print(f"key=k, value=v")


if __name__ == "__main__":
    data = "a": 1, "b": 2, "c": 3
    processes = []
    for key, value in data.items():
        process = multiprocessing.Process(target=doSomething, args=(key, value))
        processes.append(process)
    for process in processes:
        process.start()
    for process in processes:
        process.join()

现在,将import multiprocessing 替换为

class multiprocessing:  # Fake multiprocessing, not multiprocessing at all
    def __init__(self, target, args):
        self.target = target
        self.args = args

    @staticmethod
    def Process(target, args):
        return multiprocessing(target, args)

    def start(self):
        self.target(*self.args)

    def join(self):
        pass

这个想法是您提供完全相同的接口(相同的名称),但不进行多处理。您可以轻松地在多处理之间切换。

multiprocessing 不再是库而是类 multiprocessing.Process不再是进程对象的构造函数,而是静态方法 start() 只是调用方法 join() 什么都不做,因为它已经同步运行了

【讨论】:

以上是关于如何将多进程更改为单进程的主要内容,如果未能解决你的问题,请参考以下文章

[EDA] 给出一个双进程状态机,请把它改为单进程状态机。

如何将sql代码更改为informatica进程

Linux多进程的应用

多进程

多线程学习一(多线程基础)

怎样实现单进程单进程单窗口IP?