多进程进程Python3-返回DataFrames

时间:2019-03-18 15:13:28

标签: python-3.x pickle python-multiprocessing

我有一个大功能,需要并行运行才能节省计算时间。该函数获取名称和列表,并返回包含计算结果的数据框。 我需要将每个数据框返回并保存到列表(或其他内容)中。 我可以使用PROCESS进行并行运行,但是它将返回一个累积数据帧。我如何从每个过程中获取数据框而又不累加。 因此:

DF1 = A B
      1 2
      2 4


DF2 = A B
      1 3
      5 6

我得到的是:

DF1 = A B
      1 2
      2 4

DF2 = A B
      1 2
      2 4
      1 3
      5 6

我在下面粘贴了示例代码: 预先谢谢您-我似乎无法弄清楚这一点。

if __name__ == "__main__":

    SectorA = ["AAPL", "ATVI", "BIDU"]
    SectorB = ['AA','IBM','UAL']
    sectors = [SectorA,SectorB, Tech_Sector, TransP_Sector]
    sectorsNames = ['SectorA', 'SectorB']

    ######################################################################
    procs = []
    #proc = Process(target=RUN_Function)  # instantiating without any argument
    #procs.append(proc)
    #proc.start()

    # instantiating process with arguments
    for name, sec in itt.zip_longest(sectorsNames, sectors):
        info("My Main")
        proc = Process(target=RUN_Function, args=(name,sec))
        procs.append(proc)
        procs.start()
        #proc.join()

    '''
    for mpos in procs:
        print("Positions for the following: ".format(mpos))
    '''

    print("Finished")

    proc.terminate()

2 个答案:

答案 0 :(得分:0)

我无法为您提供多重处理功能,但例如,也许AsyncIO可能会引起您的兴趣

代码

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

# python 3.7.2

from asyncio import ensure_future, gather, run
from json import dumps


async def calculate(data):
    tasks = list()
    result = dict()
    temp = None

    for df in data:
        task = ensure_future(calculate_one(df, data[df]))
        tasks.append(task)

        temp = await gather(*tasks)

    for element in temp:
        result[element['df']] = element['ds']

    return result


async def calculate_one(df, dataset):
    result = dict()
    result['df'] = df
    result['ds'] = list()
    for element in dataset:
        result['ds'].append(element + '-processed')

    return result


if __name__ == '__main__':

    src_data = {'df1': ['a1', 'b1', 'c1', 'd1'],
                'df2': ['a2', 'b2', 'c2', 'd2']}

    res = run(calculate(src_data))

    print(dumps(res, indent=4))

结果

{
    "df1": [
        "a1-processed",
        "b1-processed",
        "c1-processed",
        "d1-processed"
    ],
    "df2": [
        "a2-processed",
        "b2-processed",
        "c2-processed",
        "d2-processed"
    ]
}

您的示例不是很清楚,因此,如果您需要其他数据帧中的数据进行处理,则可以使用全局变量,也可以将所有scr_data放入calculate_one并使用索引。

希望它将对您有帮助!

答案 1 :(得分:0)

谢谢Dmitrii,

我终于解决了这个问题。

我当时忽略了.append()。

这应该被排除,并在循环之后添加.close()。希望这对其他人有帮助。

for name, sec in zip(sectorsNames, sectors):
    #info("My Main")
    proc = Process(target=RUN_Function, args=(name,sec))
    #procs.append(proc)---#EXCLUDE THIS
    proc.start()
#procs.append(proc)
proc.close() #ADD THE CLOSE