我编写了一个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
我只想打印一份并为一个过程写信。
答案 0 :(得分:0)
您正在观察的行为是预期的。使用multiprocessing.Pool()
的目的是将工作分配到一组工作人员(即流程)上。有关实现所需内容的一种方法,请参见multiprocessing.Pool with maxtasksperchild produces equal PIDs。但老实说,在我看来,如果您想为内部循环的每次迭代生成一个新进程,则应该只使用multiprocessing.Process()
。