Multithreading problem

probem1:
the following program can only run in irb console,it can’t run with
command :
ruby /home/test.rb,why?
require ‘rubygems’
require ‘net/http’
threads = []
open(“/home/pt/test/data”,“a+”) do |wfile|
str=%w(http://table.finance.yahoo.com/table.csv?s=IBM
http://table.finance.yahoo.com/table.csv?s=YHOO
http://table.finance.yahoo.com/table.csv?s=AACC)
for page_to_fetch in str
Thread.new(page_to_fetch) do |url|
info = Net::HTTP.get_response(URI.parse(url)).body
puts info
end
end
threads.each {|thr| thr.join}
end
problem2:
i want to write output into my file,just change “puts info” into
“wfile.puts info”,it can not run.
require ‘rubygems’
require ‘net/http’
threads = []
open(“/home/pt/test/data”,“a+”) do |wfile|
str=%w(http://table.finance.yahoo.com/table.csv?s=IBM
http://table.finance.yahoo.com/table.csv?s=YHOO
http://table.finance.yahoo.com/table.csv?s=AACC)
for page_to_fetch in str
Thread.new(page_to_fetch) do |url|
info = Net::HTTP.get_response(URI.parse(url)).body
wfile.puts info
end
end
threads.each {|thr| thr.join}
end

Pen T. wrote:

probem1:
the following program can only run in irb console,it can’t run with
command :
ruby /home/test.rb,why?
require ‘rubygems’
require ‘net/http’
threads = []
open(“/home/pt/test/data”,“a+”) do |wfile|
str=%w(http://table.finance.yahoo.com/table.csv?s=IBM
http://table.finance.yahoo.com/table.csv?s=YHOO
http://table.finance.yahoo.com/table.csv?s=AACC)
for page_to_fetch in str
Thread.new(page_to_fetch) do |url|
info = Net::HTTP.get_response(URI.parse(url)).body
puts info
end
end
threads.each {|thr| thr.join}
end

threads is still an empty array. Try adding each thread to threads as
you create it.

u forgot to add it to ur thread list array “threads[]” after u created a
thread.
so the array “threads[]” left empty and u joined nothing in the end
then these threads were terminated because the main thread was
terminated
and u got nothing in that file

2010/8/12 Pen T. [email protected]

Or simply:

threads << Thread.new do

end

On Thu, Aug 12, 2010 at 5:09 AM, Paul H. [email protected]
wrote:

http://table.finance.yahoo.com/table.csv?s=YHOO
threads is still an empty array. Try adding each thread to threads as
you create it.

An idiom I usually use is this:

threads = str.map do
Thread.new […snip…]
end

threads.each {|t| t.join}

Jesus.

On Thu, Aug 12, 2010 at 9:53 AM, Brian C. [email protected]
wrote:

Or simply:

threads << Thread.new do

end

But you still need the outer iteration. If I’m already iterating with
#each, I change it to map to do both things at the same time :slight_smile:

Jesus.

Jesús Gabriel y Galán wrote:

But you still need the outer iteration. If I’m already iterating with
#each, I change it to map to do both things at the same time :slight_smile:

Of course. But for a newcomer to ruby (who is still using ‘for’ instead
of ‘each’), it may be easier to take one step at a time along the road
to enlightenment.

Step 1:

threads = []
for page in str
threads << Thread.new do

end
end

Step 2:

threads = []
str.each do |page|
threads << Thread.new do

end
end

Step 3:

threads = str.map do |page|
Thread.new do

end
end

On Thu, Aug 12, 2010 at 10:49 AM, Brian C. [email protected]
wrote:

Jesús Gabriel y Galán wrote:

But you still need the outer iteration. If I’m already iterating with
#each, I change it to map to do both things at the same time :slight_smile:

Of course. But for a newcomer to ruby (who is still using ‘for’ instead
of ‘each’), it may be easier to take one step at a time along the road
to enlightenment.

Yes, you are right.