首页 > 解决方案 > 进程池中的同一个进程会被执行多次

问题描述

我写了一个python脚本来测试多进程池,并使用apply_async调用类方法。但是为什么同一个进程(同一个pid)会在输出中多次输出呢?

操作系统:centos-7.4 Python:python-2.7

#!/usr/bin/env python
import time
import os
from multiprocessing import Pool

class New(object):
        def __init__(self):
                self.pid = os.getpid()

        def gen(self, num):
                pid = os.getpid()
                print 'NEW PROCESS PID IS {}'.format(pid)
                return (pid, num)

        def log(self, pid):
                print 'START WRITE {} INTO FILE'.format(pid[0])
                with open('log', 'a') as f:
                        f.write('CURRENT PROCESS IS {} <--> NUM IS {}\n'.format(pid[0], pid[1]))
        def start(self):
                print 'CREATE MAIN PROCESS {}'.format(self.pid)
                self.pool = Pool()
                num = 0
                while True:
                        narg = num
                        self.pool.apply_async(self, args=(narg,), callback=self.log)
                        num += 1
                        time.sleep(2)
                self.pool.close()
                self.pool.join()
        def __call__(self, num):
                return self.gen(num)

        def __getstate__(self):
                self_dict = self.__dict__.copy()
                del self_dict['pool']
                return self_dict

        def __setstate__(self, state):
                self.__dict__.update(state)

if __name__ == '__main__':
        new = New()
        new.start()

下面是脚本打印的结果,两次输出相同的进程id,具体代码如下。 eg:

NEW PROCESS PID IS 14459
START WRITE 14459 INTO FILE
NEW PROCESS PID IS 14459
START WRITE 14459 INTO FILE

apply_async 的回调会将一些行写入文件。同时输出如下 eg:

CURRENT PROCESS IS 14459 <--> NUM IS 29
CURRENT PROCESS IS 14459 <--> NUM IS 30

我只想为一个进程打印一份并写一份。

标签: python

解决方案


您正在观察的行为是预期的。使用 a 的multiprocessing.Pool()目的是将工作分配给一组工作人员(即进程)。请参阅multiprocessing.Pool 与 maxtasksperchild 产生相等的 PID以实现您想要的一种方式。multiprocessing.Process()但老实说,在我看来,如果你想为内部循环的每次迭代生成一个新进程,你应该只使用它。


推荐阅读