使用带apply_async或map_async的池?

时间:2017-03-14 13:52:50

标签: python multiprocessing python-2.x

第一次发表海报,请耐心等待。

我使用的是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()

0 个答案:

没有答案