Python多处理性能下降
我已经编写了一个Python脚本,使用Python多处理性能下降,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我已经编写了一个Python脚本,使用多处理和子进程模块,一次并行运行8个(多处理.cpu_count())Java进程 一些相关规范(为简洁起见进行了修订): 类任务(对象): def uuu init uuu(self,inputfile): self.inputfile=inputfile self.command=['java','-jar',process.jar','-dir',inputfile] def执行(自我): 子进程调用(self.command) #清除未使用的内存 子
多处理
和子进程
模块,一次并行运行8个(多处理.cpu_count()
)Java进程
一些相关规范(为简洁起见进行了修订):
类任务(对象):
def uuu init uuu(self,inputfile):
self.inputfile=inputfile
self.command=['java','-jar',process.jar','-dir',inputfile]
def执行(自我):
子进程调用(self.command)
#清除未使用的内存
子进程检查输出('sync&&echo 3>/proc/sys/vm/drop\u caches',shell=True)
类使用者(多处理.Process):
定义初始化(self,taskqueue):
多处理。进程。初始化(自)
self.taskqueue=taskqueue
def运行(自):
proc_name=self.name
尽管如此:
task=self.taskqueue.get()
如果任务为无:
self.taskqueue.task_done()
打破
task.execute()
self.taskqueue.task_done()
def main():
如果len(系统argv)<2:
返回
taskqueue=多处理。JoinableQueue()
num\u consumers=multiprocessing.cpu\u count()
consumers=[xrange中i的Consumer(taskqueue)(num_consumers)]
folders=[f代表os.listdir(sys.argv[1])中的f,如果“.”不在f中]
对于消费者中的c:
c、 开始()
对于文件夹中的文件夹:
taskqueue.put(任务(sys.argv[1]+文件夹))
对于xrange中的i(用户数):
taskqueue.put(无)
taskqueue.join()
总共有2800个文件需要处理,因此这是一个相当长的过程,我预计需要几天才能完成。它们都被添加到可连接队列
。最初,所有8个进程都做相同数量的工作,但过了一段时间,根据日志输出判断,似乎只有一个进程在做工作。每小时产生的输出数量也表明了这一点。但是,检查top
显示,所有8个进程都在使用各自核心的100%。这看起来很奇怪,我很难理解到底发生了什么
这是在一个有68GB RAM和8核cpu的AWS实例上运行的。我认为这里的100%意味着,每个进程消耗各自核心的100%。@RaydelMiranda是的,它们都是java进程。可能出于某种原因,队列中至少有一个作业?如果这是
多处理
模块的一个怪癖,请注意,您也可以使用线程
。不管怎样,实际工作都是在子流程中完成的。@JanneKarila你说得很好,我似乎忽略了这一点。
class Task(object):
def __init__(self, inputfile):
self.inputfile = inputfile
self.command = ['java', '-jar', 'process.jar', '-dir', inputfile]
def execute(self):
subprocess.call(self.command)
# clear unused memory
subprocess.check_output('sync && echo 3 > /proc/sys/vm/drop_caches', shell=True)
class Consumer(multiprocessing.Process):
def __init__(self, taskqueue):
multiprocessing.Process.__init__(self)
self.taskqueue = taskqueue
def run(self):
proc_name = self.name
while True:
task = self.taskqueue.get()
if task is None:
self.taskqueue.task_done()
break
task.execute()
self.taskqueue.task_done()
def main():
if len(sys.argv) < 2:
return
taskqueue = multiprocessing.JoinableQueue()
num_consumers = multiprocessing.cpu_count()
consumers = [Consumer(taskqueue) for i in xrange(num_consumers)]
folders = [f for f in os.listdir(sys.argv[1]) if '.' not in f]
for c in consumers:
c.start()
for folder in folders:
taskqueue.put(Task(sys.argv[1] + folder))
for i in xrange(num_consumers):
taskqueue.put(None)
taskqueue.join()