第一次发表海报,请耐心等待。
我使用的是Python 2.7.12,我想使用多处理模块来加速我的代码。
我的程序以各种格式(pdf,xslx,docx等)获取文件并提取其中的数据并将其保存在.txt或.csv文件中。
问题是我有几千个要处理的文件,并且使用一个核心,我使用的测试文件夹(填充了不同的文件)需要1个多小时。
我已经阅读了许多使用pool和apply_async,map_async,map的不同示例......但每当我尝试将它们调整到我的代码时,它们就会运行但不做任何事情并且不会抛出任何错误。
我唯一需要处理的多处理方法是multiprocessing.Process,但是我无法告诉它只能在8个内核上运行,所以它启动的程序与我传给他的文件一样多。不是很优雅,但做的工作。
我目前正在学习python,并希望了解使用该库的正确方法,所以我求助于你。请帮助我学习使用Pool和apply_async以及map_async。
下面我将附加在单核上运行的代码,使用带有Process的多核,并使用不工作的apply_async,以便您更好地建议我。
使用一个核心:
def start(self, fileorfolder):
"""
Starts the function and converts files and folders
:param fileorfolder: str. absolute path to a file or folder
:return:
"""
print self.folder_dictio
if os.path.isdir(fileorfolder):
archives = (file for file in os.listdir(fileorfolder)
if os.path.isfile(os.path.join(fileorfolder, file)))
for data in archives:
out_q = multiprocessing.Queue()
p = multiprocessing.Process(target=self.selector, args=(os.path.join(fileorfolder, data), out_q))
p.start()
# Wait for 120 seconds or until process finishes
p.join(120)
text = ""
version = ""
extension = ""
version, extension, text = out_q.get()
path, name = os.path.split(data)
if (extension == "xlsx") or (extension == "ods"):
with open(os.path.join(self.folder_dictio['csv'], name + ".csv"), 'wb') \
as archive:
archive.write(text)
else:
with open(os.path.join(self.folder_dictio['txt'], name + ".txt"), 'wb') \
as archive:
archive.write(text)
使用流程的多核:
def start(self, fileorfolder):
"""
Starts the function and converts files and folders
:param fileorfolder: str. absolute path to a file or folder
:return:
"""
start = time.time()
print self.folder_dictio
if os.path.isdir(fileorfolder):
archives = (file for file in os.listdir(fileorfolder)
if os.path.isfile(os.path.join(fileorfolder, file)))
lista = []
for files in archives:
lista.append(os.path.join(fileorfolder, files))
jobs = []
for i in lista:
p = multiprocessing.Process(target=self.selector, args=(i,))
jobs.append(p)
p.start()
for joc in jobs:
joc.join(120)
joc.terminate()
非工作apply_async:
def start(self, fileorfolder):
"""
Starts the function and converts files and folders
:param fileorfolder: str. absolute path to a file or folder
:return:
"""
start = time.time()
print self.folder_dictio
if os.path.isdir(fileorfolder):
archives = (file for file in os.listdir(fileorfolder)
if os.path.isfile(os.path.join(fileorfolder, file)))
lista = []
for files in archives:
lista.append(os.path.join(fileorfolder, files))
pool = multiprocessing.Pool()
for items in lista:
pool.apply_async(self.selector, items)
pool.close()
pool.join()