小编Ste*_*tam的帖子

Ruby套接字性能特征

我在Ruby中对TCP套接字执行重复的发送/接收调用,并且发现两个套接字使用之间存在显着的速度差异 - 简单地说,重新使用套接字比连续关闭和重新打开套接字要.

因此服务器是:

s = TCPServer.new( 4545 )
while( c = s.accept )
  while( m = c.gets )
    c.puts( m.chomp )
  end
end
s.close
Run Code Online (Sandbox Code Playgroud)

它只是将请求回传给客户端.

客户端1每次重新连接:

t1 = Time.now
1000.times{
  s = TCPSocket.new( '127.0.0.1', 4545 )
  s.puts( 'test' )
  s.gets
  s.close
}
puts "Reconnecting: #{Time.now - t1}s"
Run Code Online (Sandbox Code Playgroud)

客户端2保持其套接字打开:

t1 = Time.now
s = TCPSocket.new( '127.0.0.1', 4545 )
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) #Nagle
1000.times{
  s.puts( 'test' )
  s.gets
}
s.close
puts "Persistent: #{Time.now - t1}s"
Run Code Online (Sandbox Code Playgroud)

运行此代码的结果如下:

% ruby test_client.rb …
Run Code Online (Sandbox Code Playgroud)

ruby sockets performance tcp

9
推荐指数
1
解决办法
1487
查看次数

我如何设置$?在PS1调用的函数中?

我目前在bash中有一个提示,它调用一个函数来输出最后一个命令运行的返回码(如果非零):

exit_code_prompt()
{
    local exit_code=$?
    if [ $exit_code -ne 0 ]
    then
        tput setaf 1
        printf "%s" $exit_code
        tput sgr0
    fi
}


PS1='$(exit_code_prompt)\$ '
Run Code Online (Sandbox Code Playgroud)

除非$?不重置,除非运行另一个命令,否则这样可以很好地工作:

$ echo "works"
works
$ command_not_found
bash: command_not_found: command not found
127$ 
127$ 
127$ 
127$ echo "works"
works
$
Run Code Online (Sandbox Code Playgroud)

是否可以$?在第一次exit_code_prompt()运行时重置/取消设置父shell 的值,使其不再继续重复提示中的值?

非常感谢,史蒂夫.

bash command-prompt .bash-profile ps1

6
推荐指数
1
解决办法
292
查看次数

Ruby文件句柄管理(打开文件太多)

我在ruby(2.0.0 p39474)中执行非常快速的文件访问,并继续获得异常 Too many open files

看了这个帖子,这里和其他各种来源,我很清楚操作系统限制(设置1024在我的系统上).

执行此文件访问的代码部分是互斥的,并采用以下形式:

File.open( filename, 'w'){|f| Marshal.dump(value, f) }
Run Code Online (Sandbox Code Playgroud)

哪里filename有快速变化,取决于调用该部分的线程.我的理解是这个表单在块之后放弃了它的文件句柄.

我可以验证File打开的对象数量ObjectSpace.each_object(File).这报告内存中最多有100个驻留,但只有一个是开放的,正如预期的那样.

此外,异常本身在File报告的对象只有10-40个时抛出ObjectSpace.此外,手动垃圾收集无法改善任何这些计数,因为通过插入sleep调用来减慢我的脚本速度.

我的问题是:

  • 我是否从根本上误解了操作系统限制的性质 - 它是否涵盖了流程的整个生命周期?
    • 如果是这样,Web服务器如何在访问ulimit -n文件后避免崩溃?
    • ruby是否在其对象系统之外保留其文件句柄,或者内核在计算"并发"访问时速度非常慢?

编辑20130417: strace表示ruby不会将所有数据写入文件,在执行此操作之前返回并释放互斥锁.因此,文件处理堆栈直到操作系统限制.

为了解决这个问题,我使用了syswrite/ sysread,同步模式,flush之前调用过close.这些方法都不起作用.

我的问题因此被修改为: 为什么ruby无法关闭其文件句柄,我怎么能强迫它这样做呢?

ruby file-io limits

6
推荐指数
1
解决办法
1777
查看次数

红宝石异常如何导致mutices解锁?

最近,我一直在使用Ruby的线程,并且发现了一些意外的行为。在关键部分,调用raise会导致互斥体释放。我可以期望这种synchronize方法及其功能块,但似乎在lockunlock分别调用时也会发生。

例如,以下代码输出:

$ ruby testmutex.rb 
x sync
y sync
Run Code Online (Sandbox Code Playgroud)

...在y宇宙热死之前我一直希望能被阻止。

m = Mutex.new


x = Thread.new() do
  begin
    m.lock
      puts "x sync"
      sleep 5
      raise "x err"
      sleep 5
    m.unlock 
  rescue 
  end
end


y = Thread.new() do
  sleep 0.5
  m.lock
    puts "y sync"
  m.unlock 
end


x.join
y.join
Run Code Online (Sandbox Code Playgroud)

为什么即使从未执行过x线程中的m.unlock,也允许y线程运行?

ruby multithreading mutex exception synchronize

5
推荐指数
1
解决办法
864
查看次数

Ruby RSS/Atom 创建 - 包括内容

我正在使用 ruby​​ 的 stdlibrss库创建一个 Atom 提要。该库基本上没有记录,但我使用此页面上提供的示例使其工作:

require 'rss'

rss = RSS::Maker.make("atom") do |m|

    m.channel.author  = "Steve Wattam"
    m.channel.updated = Time.now
    m.channel.about   = "http://stephenwattam.com/blog/"
    m.channel.title   = "Steve W's Blog"

    storage.posts.each do |p|
        m.items.new_item do |item|
            item.link    = p.link
            item.title   = p.title
            item.updated = p.edited
            item.pubDate = p.date
            item.summary = p.summary
        end
    end
 end
Run Code Online (Sandbox Code Playgroud)

这工作正常。但是,我无法添加内容元素。目前是没有这样的事item.content=,而且我似乎无法在网上找到任何示例代码---源的浏览指示content 存储在项(文档在这里),但我缺乏足够的知识梳理出来。

有谁知道我可能会如何添加内容元素?

顺便说一句,我知道存在其他库可以执行此操作,但理想情况下希望在不需要任何 gem 的情况下使其工作。

ruby rss atom-feed

2
推荐指数
1
解决办法
417
查看次数