Python 如何获得多处理结果?

Python 如何获得多处理结果?,python,python-multiprocessing,Python,Python Multiprocessing,我希望在多重处理后将工作结果存储在特定变量中,如下所示 或者,我想将作业结果保存为csv文件。我可以知道怎么做吗 这是我的代码: (我想获取“df4”和“df7”数据并保存csv文件) 看起来您的函数cal1和cal2是相同的,只是它们试图将结果分配给一些不同的全局变量。这是行不通的,因为当您在子流程中运行它们时,它们将在子流程中分配该全局变量,但这对启动它们的主流程没有任何影响 如果要跨多个进程将函数映射到多个输入范围,可以使用进程和 例如: def-cal(输入列表): 开始=时间。时间()

我希望在多重处理后将工作结果存储在特定变量中,如下所示

或者,我想将作业结果保存为csv文件。我可以知道怎么做吗

这是我的代码:

(我想获取“df4”和“df7”数据并保存csv文件)


看起来您的函数
cal1
cal2
是相同的,只是它们试图将结果分配给一些不同的全局变量。这是行不通的,因为当您在子流程中运行它们时,它们将在子流程中分配该全局变量,但这对启动它们的主流程没有任何影响

如果要跨多个进程将函数映射到多个输入范围,可以使用进程和

例如:

def-cal(输入列表):
开始=时间。时间()
对于枚举中的i,t(输入列表):
df2=pd.DataFrame(df1[df1['resion']==t])#'df1'是原始数据
如果i%2==0:
打印(“cal1函数处理:”,i)
end=time.time()
打印(结束-开始)
其他:
通过
对于n,枚举中的d(日期):
df3=pd.DataFrame(df2[df2['date']=d])
df3['number']=df3['price'].排名(pct=True,升序=False)
df4=df4.append(pd.DataFrame(df3))
#我没有修改您的原始代码,但我不确定这一点
#是怎么做的,因为你一次通过
#外环。我还没有仔细检查你到底想做什么
#但我怀疑这也是错误的。
返回df4
然后创建一个流程池,您可以按照自己的意愿分割输入(或者,通过一些调整,您可以让
pool.map
为您分割输入,然后将map的输出减少为单个输出):

pool=multiprocessing.pool(2)
dfs=pool.map(cal[list1.iloc[0:10],list1.iloc[10:20]]

这只是为了让你开始。我可能还会做一些其他不同的事情。

这是否回答了您的问题?谢谢你的建议。我试过你告诉我的密码。但是,“for循环”不起作用。只有第一个“列表”起作用。。。。。。(我的意思是,list1.iloc[0:1],list1.iloc[10:11])是的,请参阅我在代码副本中添加的注释。您在
cal1
cal2
中对循环进行编码的方式有缺陷,因为它在一次迭代后从循环返回,但这与多处理问题无关。感谢您的解释。这很有帮助。
import pandas as pd
from pandas import DataFrame
import time
import multiprocessing

df2 = pd.DataFrame()
df3 = pd.DataFrame()
df4 = pd.DataFrame()
df5 = pd.DataFrame()
df6 = pd.DataFrame()
df7 = pd.DataFrame()
df8 = pd.DataFrame()

date = '2011-03', '2011-02' ........ '2021-03'    #There are 120 list.
list1 = df1['resion'].drop_duplicates()  # There are 20 list. 'df1' is original data

#I'd like to divide the list and work on it. 
list11 = list1.iloc[0:10]
list12 = list1.iloc[10:20]

#It's a function using 'list11'.
def cal1():
    global df2
    global df3
    global df4

    start = time.time()

    for i, t in enumerate(list11):    
        df2 = pd.DataFrame(df1[df1['resion'] == t])  #'df1' is original data

        if i%2 == 0:
            print ("cal1 function processing: ", i)
            end = time.time()
            print (end-start)

        else:
            pass

        for n, d in enumerate(date):               
            df3 = pd.DataFrame(df2[df2['date'] == d])
            df3['number'] = df3['price'].rank(pct=True, ascending = False )
            df4 = df4.append(pd.DataFrame(df3))

        return df4

#It's a function using 'list12'.

def cal2():
    global df5
    global df6
    global df7

    start = time.time()

    for i, t in enumerate(list12):    
        df5 = pd.DataFrame(df1[df1['resion'] == t])  #'df1' is original data

        if i%2 == 0:
            print ("cal1 function processing: ", i)
            end = time.time()
            print (end-start)

        else:
            pass

        for n, d in enumerate(date):               
            df6 = pd.DataFrame(df5[df5['date'] == d])
            df6['number'] = df6['price'].rank(pct=True, ascending = False )
            df7 = df7.append(pd.DataFrame(df6))

        return df7

## Multiprocessing code

if __name__ == "__main__":
    # creating processes
    p1 = multiprocessing.Process(target=cal1, args=())
    p2 = multiprocessing.Process(target=cal2, args=())
  
    # starting process 1
    p1.start()
    # starting process 2
    p2.start()
  
    # wait until process 1 is finished
    p1.join()
    
    # wait until process 2 is finished
    p2.join()
  
    # both processes finished
    print("Done!")