Python Multiprocessing and Serializing Data
我正在使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import multiprocessing as mp import time, pickle def simulation(j): data = [] for k in range(10): data.append(k) time.sleep(1) file = open('data%d.pkl'%j, 'wb') pickle.dump(data, file) file.close() if __name__ == '__main__': processes = [] processes.append(mp.Process(target = simulation, args = (1,) )) processes.append(mp.Process(target = simulation, args = (2,) )) for process in processes: process.start() for process in processes: process.join() |
因此,当我实际运行我的代码以进行更多模拟以及我认为更密集的各种任务时,我会收到以下错误:
我的问题:
- 如何在脚本中修复此错误?
- 这个错误对于python newcomer意味着什么?参考文献赞赏。
关于我的程序的一些注意事项:
-
我没有将多进程属性
daemon 设置为True ,而是使用屏幕运行脚本然后分离。这允许我也断开连接而不用担心我的脚本停止。 -
这似乎是关于使用
subprocess 模块进行打印的相关问题。我没有像我说的那样明确地使用守护进程,所以不确定这是否会有所帮助。 - 这通常在运行大约一天后发生,并且在不同时间发生在不同的进程上。
你的程序看起来很不错。 在这种情况下,
以下版本中的几项改进:
-
生成一些数据后,将其附加到数据文件中
从记忆中消除它。 程序应该具有大致相同的RAM使用时间,而不是越来越多地使用,然后崩溃。 -
方便的是,如果文件是
pickle 对象的串联,我们
可以轻松打印出每一个以供进一步检查。 示例代码显示。
玩得开心!
资源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import multiprocessing as mp import glob, time, pickle, sys def simulation(j): for k in range(10): datum = {'result': k} time.sleep(1) with open('data%d.pkl'%j, 'ab') as dataf: pickle.dump(datum, dataf) def show(): for datname in glob.glob('data*.pkl'): try: print '*'*8, datname with open(datname, 'rb') as datf: while True: print pickle.load(datf) except EOFError: pass def do_sim(): processes = [] processes.append(mp.Process(target = simulation, args = (1,) )) processes.append(mp.Process(target = simulation, args = (2,) )) for process in processes: process.start() for process in processes: process.join() if __name__ == '__main__': if '--show' in sys.argv: show() else: do_sim() |
输出"python ./msim.py --show"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ******** data2.pkl {'result': 0} {'result': 1} {'result': 2} {'result': 3} {'result': 4} {'result': 5} {'result': 6} {'result': 7} {'result': 8} {'result': 9} ******** data1.pkl {'result': 0} {'result': 1} {'result': 2} {'result': 3} {'result': 4} {'result': 5} {'result': 6} {'result': 7} {'result': 8} {'result': 9} |