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

···

--
Posted via http://www.ruby-forum.com/.

Pen Ttt 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.

···

--
Posted via http://www.ruby-forum.com/.

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 Ttt <myocean135@yahoo.cn>

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
--
Posted via http://www.ruby-forum.com/.

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 5:09 AM, Paul Harrington <xeno@badenoughdu.de> wrote:

Pen Ttt 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.

Or simply:

  threads << Thread.new do
    ...
  end

···

--
Posted via http://www.ruby-forum.com/.

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.

···

On Thu, Aug 12, 2010 at 9:53 AM, Brian Candler <b.candler@pobox.com> wrote:

Or simply:

threads << Thread.new do
...
end

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

···

--
Posted via http://www.ruby-forum.com/.

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.

···

On Thu, Aug 12, 2010 at 10:49 AM, Brian Candler <b.candler@pobox.com> wrote:

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