进程池中的同一进程将被多次执行

时间:2019-07-19 10:37:44

标签: python

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

OS: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输出两次,具体代码如下。 例如:

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您正在观察的行为是预期的。使用multiprocessing.Pool()的目的是将工作分配到一组工作人员(即流程)上。有关实现所需内容的一种方法,请参见multiprocessing.Pool with maxtasksperchild produces equal PIDs。但老实说,在我看来,如果您想为内部循环的每次迭代生成一个新进程,则应该只使用multiprocessing.Process()