【问题标题】: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)即可。但是,现在无论需要多长时间,您都将阻塞直到函数返回。

标签: python process multiprocessing multiprocess


【解决方案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() 什么都不做,因为它已经同步运行了

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2012-03-27
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多