我正在学校计算机上运行脚本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新手来说意味着什么?参考文献表示赞赏。
关于我的程序的更多注意事项:
- 而不是设置多进程属性
daemon
to be True
,我使用 screen 运行脚本然后分离。这也允许我断开连接,而不必担心我的脚本停止。
- 这似乎是一个相关的question关于使用打印
subprocess
模块。我没有像我说的那样明确使用守护进程,所以不确定这是否有帮助。
- 这通常发生在运行大约一天之后,并且发生在不同进程的不同时间。
你的程序看起来很不错。在这种情况下IOError
只是意味着“坏事发生了”。整套模拟数据对于Python进程来说变得太大了,所以它带着神秘的消息退出了。
以下版本中的一些改进:
玩得开心!
source
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}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)