我正在尝试并行计算数字,并将它们放入谷歌电子表格中的单元格中。以下是我的代码:
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
的函数。这有问题吗?
主要问题是,对于多处理,每个进程都有自己的内存空间,因此可以看到变量sheet2
的自己的副本。
第二个问题是,您的代码使用相同的参数调用myfunc
5次,并使用相同的值更新相同的单元格5次,因此这不是一个现实的用例。一个更现实的例子是,您需要用5个不同的参数设置调用myfunc
的5个不同单元格。解决此问题的最简单方法不是让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()