それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rubyのスレッドで404チェッカー

Rubyのスレッドで404チェックをしてみる。RubyのスレッドはIO待ちのときに、制御を切り替えるので、たぶん普通にするより高速になる。

#!/usr/bin/env ruby
#Queueを使って、404チェックをする
require 'thread'
require "open-uri"

q = Queue.new
#標準入力
input = ARGF|| $stdin
#QueueにURLをどんどん追加する。
input.each {|line|
	q.push line.chop
}
#アクセスできないURLをチェックする
def check404(url)
	require "open-uri"
	begin
		puts(url)
		open("#{url}") {|f|
		}
	rescue
		p $!
	end
end
#Queueを処理するスレッドを作る
threads = [1,2,3,4,5]
threads.map! {|i|
	t = Thread.new { 
		require "open-uri"
		loop {
			url = q.pop
			check404 url
		}
	}

}
#スレッドに登録するProcをつくる
threads.each{|t|
	t.join
}
Signal.trap('INT'){
	print "\nINTを補足した。\n"
	Thread::list.each {|t| Thread::kill(t) if t != Thread::current}
	exit 1
}

STDERR.print "END\r\n"

なるはず。。。だけど、なぜかメモリエラー?で落ちる。

Rubyのスレッドがまだよくわかってない。

たぶん間違ってる