问题的产生是因为
multiprocessing.Pool
创建单独的进程,进程之间共享的对象被序列化和反序列化。在此过程中,对原始对象(sheet1)的引用将丢失,因此每个进程都会得到自己的对象副本。
要解决此问题,您可以使用
multiprocessing.Queue
收集结果。而不是试图直接写信给
sheet1
在worker进程中,您可以让每个进程返回它处理的数据,主进程可以处理写入
表1
.
以下是应该可以工作的更新代码。我在进行更改的地方添加了注释:
import multiprocessing
import xlwt
from xlwt import Workbook
def get_prices_in_range(varss):
# Worker function: return the data instead of modifying the sheet
row, col, start_day = varss[0], varss[1], varss[2]
return (row, col, start_day)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=2)
# Create workbook and sheet in the main process
wb = Workbook()
sheet1 = wb.add_sheet("Sheet 1")
# Prepare inputs; removed `sheet1` since workers no longer modify it directly
inputs = [[x, 1, 2] for x in range(2)]
# Collect results from workers instead of sharing the sheet
results = pool.map(get_prices_in_range, inputs)
# Write results to the sheet in the main process
for row, col, start_day in results:
sheet1.write(row, col, start_day)
wb.save("test.xls")
如果这对你有效,请告诉我。