如何使用在不同的多处理流程中创建的变量?

时间:2018-12-29 14:46:05

标签: python python-multiprocessing

抱歉,Python有点新手。

任何人都可以帮助以下代码吗? 我正在尝试将两个独立的多处理过程创建的两个数据帧写入同一excel文件。

编辑:这是简化代码。在我的实际项目中,使用不同连接上的pd.read_sql()构建数据帧。如果这不会带来任何明显的速度,请告诉我。我只是假设正常运行将意味着在第二个连接之前等待第一个连接的SQL查询运行。

import pyodbc
import pandas as pd
import os
from datetime import datetime
import multiprocessing

def Test1():
global df
df = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})

def Test2():
    global df2
    df2 = pd.DataFrame({'Data': [20, 40, 60, 40, 30, 60, 90]})

if __name__ == '__main__':
Proc1 = multiprocessing.Process(target=Test1)
Proc2 = multiprocessing.Process(target=Test2)
Proc1.start()
Proc2.start()
Proc1.join()
Proc2.join()
writer = 
pd.ExcelWriter(os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop','Test.xlsx') , engine='xlsxwriter')
df.to_excel(writer, sheet_name='Test Title',index=False)
df2.to_excel(writer,sheet_name='Test Title2',index=False)
workbook  = writer.book
worksheet = writer.sheets['Test Title']
worksheet = writer.sheets['Test Title2']
writer.save()

我不知道要搜索答案的术语是没有帮助的。抱歉,如果这是一个比我更精通Python的人问的一个问题。

此外,错误消息:

line 37, in <module>
df.to_excel(writer, sheet_name='Test Title',index=False)
NameError: name 'df' is not defined

1 个答案:

答案 0 :(得分:0)

global与多处理结合使用并不像您似乎认为的那样。

Test1Test2都在单独的 进程中运行,该进程与父进程没有共享数据

您可以做的一些事情:

  • 在开始进程之前,先创建multiprocessing.Queue 。然后,进程可以使用该Queue将数据发送回父进程。数据可能必须能够被腌制。父级将数据写入excel文件。
  • 让每个进程将其自己的数据帧写入文件,然后向父级发送一条消息,告知它已完成。完成所有过程后,父级将它们合并到excel文件中。这种方法的一种变体是使用内存映射文件(mmap)。如果数据量不超过可用内存,则后者效果很好。

哪种方法最有效取决于许多因素。对于少量数据,使用Queue是一个不错的选择。对于使用中间文件(尤其是在SSD上)的大量数据,这是一个不错的选择。