我想实现多个流程。我必须将在不同子进程中冒泡排序的数据发送回父进程,然后合并数据。这是我的代码的一部分:
rd1,wt1 = IO.pipe # reader & writer
pid1 = fork {
rd1.close
numbers = Marshal.load(Marshal.dump(copylist[0,p]))
bubble_sort(numbers)
sList[0] = numbers.clone
wt1.write Marshal.dump(sList[0])
Process.exit!(true)
}
Process.waitpid(pid1)
Process.waitpid(pid2)
wt1.close
wt2.close
pid5 = fork {
rd5.close
a = Marshal.load(rd1.gets)
b = Marshal.load(rd2.gets)
mList[0] = merge( a,b).clone
wt5.write Marshal.dump(mList[0])
Process.exit!(true)
}
有pid1
... pid7
,rd1
... rd7
,wt1
... wt7
。 pid1
... pid4
是数据的冒泡排序4部分。 pid5
和6
合并来自pid1
,2
和pid 3
,4
的数据。最后,pid7
合并了pid5
和6
的数据。
当数据大小很小时,它会成功,但是当我输入更大的数据(10000)时:
Data example : 121 45 73 89 11 452 515 32 1 99 4 88 41 53 159 482 2013 2 ...
然后,出现错误::in 'load': marshal data too short (ArgumentError)
和另一种错误:in 'load': instance of IO needed (TypeError)
。第一个错误行位于pid5
:a = ...
和pid6
:b = ...
。另一种错误行位于pid7
:b = ...
。我的数据对于这种方法来说太大了吗?
答案 0 :(得分:1)
Marshal.load
和Marshal.dump
使用二进制数据。短读取的问题在于:
a = Marshal.load(rd1.gets)
b = Marshal.load(rd2.gets)
#gets
读取新行(或文件末尾)然后停止。麻烦的是Marshal.dump创建的二进制数据中可能存在换行符。
在两行中将gets
更改为read
。