微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何locking在ruby叉共享IO

我们如何locking多个ruby进程共享的IO?

考虑这个脚本:

#!/usr/bin/ruby -w # vim: ts=2 sw=2 et if ARGV.length != 2 $stderr.puts "Usage: test-io-fork.rb num_child num_iteration" exit 1 end CHILD = ARGV[0].to_i IteraTION = ARGV[1].to_i def Now t = Time.Now "#{t.strftime('%H:%M:%s')}.#{t.usec}" end MAP = %w(nol satu dua tiga empat lima enam tujuh delapan sembilan) IO.popen('-','w') {|pipe| unless pipe # Logger child File.open('test-io-fork.log','w') {|log| log.puts "#{Now} Program start" $stdin.each {|line| log.puts "#{Now} #{line}" } log.puts "#{Now} Program end" } exit! end pipe.sync = true pipe.puts "Before fork" CHILD.times {|c| fork { pid = Process.pid srand IteraTION.times {|i| n = rand(9) sleep(n / 100000.0) pipe.puts "##{c}:#{i} #{MAP[n]} => #{n},#{n} => #{MAP[n]} ##{c}:#{i}" } } } }

并尝试像这样:

./test-io-fork.rb 200 50

像预期的那样,test-io-fork.log文件将包含IO争用条件的标志。

fork()如何返回subprocess

一个函数如何返回两个值

为什么我的编译器不接受fork(),尽pipe包含了<unistd.h>?

fork()系统调用c

如何循环通过标准input和pipe道输出到C儿童execl命令?

我想实现的是为自定义GPS协议创build一个TCP服务器,将GPS点保存到数据库。 由于此服务器将处理1000个并发客户端,我想限制数据库连接只有一个孩子,而不是同时打开1000数据库连接。 这台服务器将运行在Linux上。

更高效地使用fork()和copy-on-write内存共享

叉 – 相同的内存地址?

什么是叉返回?

在Linux中fork()的名字是什么意思?

fork()的目的是什么?

UPDATE

答案被接受后更新可能是不好的形式,但原来有点误导。 ruby是否对自动添加的换行符进行单独的write(2)调用取决于输出IO对象的缓冲状态。

$stdout (当连接到tty时)通常是行缓冲的,所以puts()的效果 – 给定合理大小的字符串 – 隐式添加的换行符是一次调用write(2) 。 但是,与OP发现的情况不同的是, IO.pipe和$stderr 。

原来的答案

将您的主要pipe.puts()参数更改为换行符终止的字符串:

pipe.puts "##{c} ... #{i}n" # <-- note the newline

为什么? 您可以设置pipe.sync希望管道写入是原子型和非交叉型的,因为它们(可能)比PIPE_BUF字节要小。 但是它不起作用,因为ruby的pipe puts()实现单独调用write(2)来追加尾随的换行符,这就是为什么你的写操作有时会在需要换行的地方被交错。

下面是你的脚本的一个分叉部分的佐证摘录:

$ strace -s 2048 -fe trace=write ./so-1326067.rb .... 4574 write(4,"#0:12 tiga => 3,3 => tiga #0:12",32) = 32 4574 write(4,"n",1) ....

但是,放入自己的换行符可以解决问题,确保您的整个记录​​在一个系统调用中传输:

.... 5190 write(4,"#194:41 tujuh => 7,7 => tujuh #194:41n",39 <unfinished ...> 5179 write(4,"#183:38 enam => 6,6 => enam #183:38n",37 <unfinished ...> ....

如果由于某种原因不能为你工作,你将不得不协调进程间互斥(如File.flock() )。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐