Multithreading problem

P

Pen Ttt

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
 
P

Paul Harrington

Pen said:
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.
 
J

jason joo

[Note: parts of this message were removed to make it a legal post.]

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
 
J

Jesús Gabriel y Galán

Pen said:
probem1:
the following program can only run =A0in irb console,it can't run with
command :
ruby /home/test.rb,why?
require 'rubygems'
require 'net/http'
threads =3D []
open("/home/pt/test/data","a+") do |wfile|
str=3D%w(http://table.finance.yahoo.com/table.csv?s=3DIBM
http://table.finance.yahoo.com/table.csv?s=3DYHOO
http://table.finance.yahoo.com/table.csv?s=3DAACC)
for page_to_fetch in str
=A0 =A0Thread.new(page_to_fetch) do |url|
=A0 =A0 info =3D Net::HTTP.get_response(URI.parse(url)).body
=A0 =A0 puts info
=A0 =A0end
=A0end
threads.each {|thr| thr.join}
end

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

An idiom I usually use is this:

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

threads.each {|t| t.join}

Jesus.
 
J

Jesús Gabriel y Galán

Or simply:

=A0threads << Thread.new do
=A0 =A0...
=A0end

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 :)

Jesus.
 
B

Brian Candler

Jesús Gabriel y Galán said:
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 :)

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
 
J

Jesús Gabriel y Galán

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.

Step 1:

threads =3D []
for page in str
=A0threads << Thread.new do
=A0 =A0...
=A0end
end

Step 2:

threads =3D []
str.each do |page|
=A0threads << Thread.new do
=A0 =A0...
=A0end
end

Step 3:

threads =3D str.map do |page|
=A0Thread.new do
=A0 =A0...
=A0end
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top