Python多重处理:每个进程返回列表

时间:2019-03-14 21:37:29

标签: python-3.x python-multiprocessing

我正在尝试用python实现一个程序,该程序可以从4个不同的文件读取,更改数据并将其写入另一个文件。

当前,我正在尝试使用4个不同的进程读取和更改数据,以加快运行时间。

我已经尝试使用manager.list,但这会使脚本比顺序脚本慢。

是否可以在进程之间共享一个列表,或者使每个进程返回一个列表并使用这些列表扩展主进程中的列表?

谢谢

代码看起来像这样(当前myLists保持为空,因此没有任何内容写入output.csv):

from multiprocessing import Process
import queue
import time 

myLists=[[],[],[],[]]
myProcesses = []


def readAndList(filename,myList):
    with open(filename,"r") as file:
        content = file.read().split(":")
        file.close()
        j=1
        filmid=content[0]
        while j<len(content):
            for entry in content[j].split("\n"):
                if len(entry)>10:
                    print(entry)
                    myList.append(filmid+","+entry+"\n")
                else:
                    if len(entry)>0:
                        filmid=entry
            j+=1

if __name__ == '__main__':
    start=time.time()
    endList=[]
    i=1
    for loopList in myLists:
        myProcesses.append(Process(target=readAndList,args=("combined_data_"+str(i)+".txt",loopList)))
        i+=1
    for process in myProcesses:
        process.start()
    for process in myProcesses:
        process.join()

    k=0
    while k<4:
        endList.extend(myLists[k])
        k+=1

    with open("output.csv","w") as outputFile:
            outputFile.write(''.join(endList))
            outputFile.flush()
            outputFile.close()  

    end = time.time()
    print(end-start)

1 个答案:

答案 0 :(得分:0)

尝试使用现代方式。

例如。

假设我们有几个存储数字的文件,例如

1
2
3
4

以此类推。

本示例从文件中抓取它们并将其合并到列表列表中,因此您可以根据需要合并它们。该示例使用信号量来限制并行读取的次数(4)。我使用的是python 3.7.2,它也应该在3.7中工作,但我不确定。

代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from asyncio import Semaphore, ensure_future, gather, run

limit = 4


async def read(file_list):
    tasks = list()
    result = None

    sem = Semaphore(limit)

    for file in file_list:
        task = ensure_future(read_bounded(file, sem))
        tasks.append(task)

        result = await gather(*tasks)

    return result


async def read_bounded(file, sem):
    async with sem:
        return await read_one(file)


async def read_one(file):

    result = list()
    with open(file, 'r+') as f:
        for line in f.readlines():
            result.append(int(line[:-1]))

    return result


if __name__ == '__main__':

    files = ['1', '2', '3', '4']

    res = run(read(files))

    print(res)

输出

  

[[1、2、3、4、5],[6、7、8、9、10],[11、12、13、14、15],[16、17、18、19、20 ]]

我认为这种方法更快,更容易阅读。此示例可以扩展为从WEB提取数据,您可以阅读有关信息here

Asyncio和aiohttp是非常好的工具。我建议尝试它们。