2

我正在使用该multiprocessing模块在学校计算机上运行脚本。我经常序列化数据。可以用下面的代码来概括:

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()

因此,当我实际运行我的代码以进行更多模拟以及我想象的更密集的各种任务时,我收到以下错误:IOError: [Errno 5] Input/output error通常以file.open(...)or开头file.close()

我的问题:

  • 如何在我的脚本中修复此错误?
  • 这个错误对 python 新手意味着什么?参考赞赏。

关于我的程序的更多说明:

  • 我没有将 multiprocess 属性设置daemonTrue,而是使用 screen 来运行脚本然后分离。这使我也可以断开连接,而不必担心我的脚本会停止。
  • 这似乎是关于使用模块打印的相关问题。subprocess正如我所说,我没有明确使用守护进程,所以不确定这是否有帮助。
  • 这通常在运行大约一天后发生,并且在不同的时间发生在不同的进程上。
4

1 回答 1

2

你的程序看起来很不错。在这种情况下IOError,只是意味着“发生了坏事”。整个模拟数据集对于 Python 进程来说变得太大了,所以它带着神秘的信息退出了。

以下版本中的一些改进:

  • 生成一些数据后,将其附加到数据文件中,然后将其从内存中删除。随着时间的推移,该程序应该具有大致相同的 RAM 使用量,而不是越来越多地使用,然后崩溃。

  • 方便的是,如果文件是pickle对象的串联,我们可以在以后轻松打印出每个对象以供进一步检查。显示的示例代码。

玩得开心!

资源

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”的输出

******** 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}
于 2014-10-04T03:13:53.950 回答