【发布时间】:2017-08-22 20:39:02
【问题描述】:
我是 Python 新手,我正在尝试将五个不同进程的结果保存到一个 excel 文件中(每个进程写入不同的工作表)。我在这里阅读了不同的帖子,但仍然无法完成,因为我对 pool.map、队列和锁非常困惑,而且我不确定这里需要什么来完成这项任务。 到目前为止,这是我的代码:
list_of_days = ["2017.03.20", "2017.03.21", "2017.03.22", "2017.03.23", "2017.03.24"]
results = pd.DataFrame()
if __name__ == '__main__':
global list_of_days
writer = pd.ExcelWriter('myfile.xlsx', engine='xlsxwriter')
nr_of_cores = multiprocessing.cpu_count()
l = multiprocessing.Lock()
pool = multiprocessing.Pool(processes=nr_of_cores, initializer=init, initargs=(l,))
pool.map(f, range(len(list_of_days)))
pool.close()
pool.join()
def init(l):
global lock
lock = l
def f(k):
global results
*** DO SOME STUFF HERE***
results = results[ *** finished pandas dataframe *** ]
lock.acquire()
results.to_excel(writer, sheet_name=list_of_days[k])
writer.save()
lock.release()
结果是在 excel 中只创建了一张工作表(我假设它是最后完成的过程)。关于这段代码的一些问题:
- 如何避免定义全局变量?
- 甚至可以传递数据帧吗?
- 我应该改为将锁定移至 main 吗?
非常感谢这里的一些输入,因为我认为掌握多处理是有用的。谢谢
【问题讨论】:
-
如果您同时启动多个进程,您将遇到文件锁定问题,即每个进程都试图同时访问同一个文件。它们是不同的工作表并不重要,它仍然是同一个文件。此外,您的代码编写方式,每次都覆盖
myfile.xlsx。 -
是的,当然,我需要将锁放在正确的位置,以便只有 1 个进程写入文件。第二点:你是对的,我从 f(k) 中删除了 writer,它现在只在 main 中,这应该可以防止每次都覆盖文件,但是,输出只包含一张表
标签: python queue locking multiprocessing