我有6个不同的班级。
主要是,我正在创建每个类的一个对象。
我想平行地呼叫每个对象的eachObject.processFiles()
。
processFiles方法通过读取目标文件,处理数据并将其保存在持久对象中来处理目标文件。每个processFiles调用大约需要5分钟。如果顺序完成,那么主要花费大约30分钟。
我现在正在按顺序进行,但我想加快6个对象的速度。在最短的CPU时间内处理他们的文件。所有对象都是相互独立的,我认为多线程方式是有效的。但我以前从未做过多线程。所以想知道这样做是否安全,以及如何做到这一点。代码片段会有所帮助。
我该如何并行完成?
class system(object):
def __init__(self, leNameList):
self.files = fileNameList
def processFiles(self):
self.feeds= self.readFiles()
self.processFeeds()
class A(system):
def processFeeds(self):
""" process the feed
in A way """
class B(system):
def processFeeds(self):
""" process the feed
in B way """
def main():
aObj = A(fileList)
bObj = B(fileList2)
aObj.processFiles()
bObj.processFiles()
答案 0 :(得分:0)
使用multiprocessing
模块。
Foo
在这里,我使用示例数据填充了您的代码,以便您可以开箱即用来测试此解决方案,但其主旨是:
import multiprocessing
class system(object):
def __init__(self, fileNameList):
self.files = fileNameList
def processFiles(self):
# self.feeds= self.readFiles()
return self.processFeeds()
class A(system):
def processFeeds(self):
return ["A feed", "example data"] + self.files
class B(system):
def processFeeds(self):
return ["B feed", "hello world"] + self.files
def process_file_task(processor):
return processor.processFiles()
def main():
aObj = A(["a"])
bObj = B(["b"])
data = multiprocessing.Pool().map(process_file_task, [aObj, bObj])
print(data)
执行不同进程中的函数,并按顺序返回每个结果。这样做的缺点是multiprocessing.Pool().map
有时可能有点挑剔,你必须确保所有通过过程边界的东西都可以被腌制。
检查代码还有一件事是文件列表。如果它们有很多共同的文件,你应该将文件读出的过程分开,并确保不必读取同一个文件两次。