python - 进程池中的同一个进程会被执行多次
问题描述
我写了一个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
我只想为一个进程打印一份并写一份。
解决方案
您正在观察的行为是预期的。使用 a 的multiprocessing.Pool()
目的是将工作分配给一组工作人员(即进程)。请参阅multiprocessing.Pool 与 maxtasksperchild 产生相等的 PID以实现您想要的一种方式。multiprocessing.Process()
但老实说,在我看来,如果你想为内部循环的每次迭代生成一个新进程,你应该只使用它。
推荐阅读
- vue.js - How to populate form from store state data returned from vuex with getters?
- tomcat - Tomcat 部署脚本返回 405
- r - 如何在 R 循环中不将 POSIXct 转换为数字
- git - 为什么“git diff”将文件与 /dev/null 进行比较?
- python - 如何使用带有烧瓶的for循环显示json数据
- spring - 在 SpringBoot REST API 中记录经过的执行时间
- hadoop - 为什么名称节点文件使用双倍内存?
- javascript - 我在将数据推送到另一个 HTML 页面时遇到问题
- css - 是否可以在调整大小时阻止活动选择器被删除?
- java - JRuby:如果运行时间过长,是否关闭 runScriptlet?