使用多处理更新谷歌电子表格中的单元格?

时间:2021-01-13 20:00:11

标签: python python-3.x multiprocessing google-docs-api telethon

我正在尝试并行计算数字并将它们放入谷歌电子表格的单元格中。以下是我的代码:

import multiprocessing, ezsheets

ss = ezsheets.Spreadsheet(spreadsheet_url)
sheet2 = ss[1]

def myfunc(inputs):
    a = sum(inputs)
    sheet2['A1']=a
    return

processes = []
for i in range(1,5):
    p = multiprocessing.Process(target=myfunc, args=[[1,2,3]])
    p.start()
    processes.append(p)
for process in processes:
    process.join()

但它不会改变一个单元格。我做错了什么?

我正在调用一个使用来自 Telethon 的 GetHistoryRequest 的函数。这有问题吗?

1 个答案:

答案 0 :(得分:1)

主要问题是多处理的每个进程都有自己的内存空间,因此看到自己的变量 sheet2 副本。

第二个问题是您的代码使用相同的参数调用 myfunc 5 次,并使用相同的值更新相同的单元格 5 次,因此这不是一个现实的用例。一个更现实的例子是您需要设置 5 个不同的单元格,使用 5 个不同的参数调用 myfunc。解决此问题的最简单方法不是让 myfunc 尝试更新共享电子表格,而是让它返回到主进程需要在单元格中设置的值,并让主进程执行实际单元格设置。要从子进程返回值,最简单的方法是使用进程池:

from concurrent.futures import ProcessPoolExecutor
import ezsheets


def myfunc(inputs):
    return sum(inputs)

if __name__ == '__main__': # required for Windows
    ss = ezsheets.Spreadsheet(spreadsheet_url)
    sheet2 = ss[1]
    with ProcessPoolExecutor(max_workers=5) as executor:
        a1 = executor.submit(myfunc, [1,2,3])
        a2 = executor.submit(myfunc, [4,5,6])
        a3 = executor.submit(myfunc, [7,8,9])
        a4 = executor.submit(myfunc, [8,9,10])
        a5 = executor.submit(myfunc, [11,12,13])
        sheet2['A1'] = a1.result()
        sheet2['A2'] = a2.result()
        sheet2['A3'] = a3.result()
        sheet2['A4'] = a4.result()
        sheet2['A5'] = a5.result()