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) #清除未使用的内存 子

我已经编写了一个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)
#清除未使用的内存
子进程检查输出('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()