system() and `` problem in Multithreading

L

Lee Youser

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

Hi:

I want to execute external routines in my ruby program in a
multithreading way and capture the error information occured in external
routines into a log file. But when i executed external routines in this way:
error_msg = /*`...execute cmd...`*/
All threads in my program didn't seem to run in synchronous way, when i
used /*system("*//*...execute cmd...*//*"),*/ all threads did run
synchronously but i can't get the error information except using this
method: /*system("*//*...execute cmd...*//* > log_file") */and then get
the information from the log_file.


i made a curt routines to recur this problem:

---------------------------
test.rb:

threads = []
5.times do |num|
threads << Thread.new do
system("ruby a.rb thread#{num+1}")
#`ruby a.rb thread#{num+1}`
system("ruby b.rb thread#{num+1}")
#`ruby b.rb thread#{num+1}`
system("ruby c.rb thread#{num+1}")
#`ruby c.rb thread#{num+1}`
system("ruby d.rb thread#{num+1}")
#`ruby d.rb thread#{num+1}`
end
sleep(1)
end
threads.each {|t| t.join}
----------------------------

----------------------------
a.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise "#{time_now} AAAAA Exception #{ARGV}"

-----------------------------
-----------------------------
b.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise "#{time_now} BBBBB Exception #{ARGV}"

-----------------------------
-----------------------------
c.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise "#{time_now} CCCCC Exception #{ARGV}"

-----------------------------
-----------------------------
d.rb:

sleep(5)
time_now = Time.now.strftime("%H:%M:%S")
raise "#{time_now} DDDDD Exception #{ARGV}"

-----------------------------


when use */system /*the output as follow:

D:\Mywork\Ruby\project>ruby test.rb
a.rb:3: 00:12:58 AAAAA Exception thread1 (RuntimeError)
a.rb:3: 00:12:59 AAAAA Exception thread2 (RuntimeError)
a.rb:3: 00:13:00 AAAAA Exception thread3 (RuntimeError)
a.rb:3: 00:13:01 AAAAA Exception thread4 (RuntimeError)
a.rb:3: 00:13:02 AAAAA Exception thread5 (RuntimeError)
b.rb:3: 00:13:03 BBBBB Exception thread1 (RuntimeError)
b.rb:3: 00:13:04 BBBBB Exception thread2 (RuntimeError)
b.rb:3: 00:13:05 BBBBB Exception thread3 (RuntimeError)
b.rb:3: 00:13:06 BBBBB Exception thread4 (RuntimeError)
b.rb:3: 00:13:07 BBBBB Exception thread5 (RuntimeError)
c.rb:3: 00:13:08 CCCCC Exception thread1 (RuntimeError)
c.rb:3: 00:13:09 CCCCC Exception thread2 (RuntimeError)
c.rb:3: 00:13:10 CCCCC Exception thread3 (RuntimeError)
c.rb:3: 00:13:11 CCCCC Exception thread4 (RuntimeError)
c.rb:3: 00:13:12 CCCCC Exception thread5 (RuntimeError)
d.rb:3: 00:13:13 DDDDD Exception thread1 (RuntimeError)
d.rb:3: 00:13:14 DDDDD Exception thread2 (RuntimeError)
d.rb:3: 00:13:15 DDDDD Exception thread3 (RuntimeError)
d.rb:3: 00:13:16 DDDDD Exception thread4 (RuntimeError)
d.rb:3: 00:13:18 DDDDD Exception thread5 (RuntimeError)

but when use */`cmd` /*the output as follow:

D:\Mywork\Ruby\project>ruby test.rb
a.rb:3: 00:16:17 AAAAA Exception thread1 (RuntimeError)
a.rb:3: 00:16:22 AAAAA Exception thread2 (RuntimeError)
b.rb:3: 00:16:22 BBBBB Exception thread1 (RuntimeError)
b.rb:3: 00:16:28 BBBBB Exception thread2 (RuntimeError)
a.rb:3: 00:16:28 AAAAA Exception thread3 (RuntimeError)
c.rb:3: 00:16:28 CCCCC Exception thread1 (RuntimeError)
b.rb:3: 00:16:33 BBBBB Exception thread3 (RuntimeError)
d.rb:3: 00:16:33 DDDDD Exception thread1 (RuntimeError)
c.rb:3: 00:16:33 CCCCC Exception thread2 (RuntimeError)
a.rb:3: 00:16:33 AAAAA Exception thread4 (RuntimeError)
c.rb:3: 00:16:38 CCCCC Exception thread3 (RuntimeError)
d.rb:3: 00:16:38 DDDDD Exception thread2 (RuntimeError)
b.rb:3: 00:16:38 BBBBB Exception thread4 (RuntimeError)
d.rb:3: 00:16:44 DDDDD Exception thread3 (RuntimeError)
a.rb:3: 00:16:44 AAAAA Exception thread5 (RuntimeError)
c.rb:3: 00:16:44 CCCCC Exception thread4 (RuntimeError)
b.rb:3: 00:16:49 BBBBB Exception thread5 (RuntimeError)
d.rb:3: 00:16:49 DDDDD Exception thread4 (RuntimeError)
c.rb:3: 00:16:54 CCCCC Exception thread5 (RuntimeError)
d.rb:3: 00:16:59 DDDDD Exception thread5 (RuntimeError)

The expected output is the first one(use */system/*), but i don't know
why the output is different between the two ways. Could you someone can
tell me why? :)
Thank you very much!


regards
 
A

ara.t.howard

The expected output is the first one(use */system/*), but i don't know
why the output is different between the two ways. Could you someone
can
tell me why? :)
Thank you very much!

the order threads run is *always* undefined unless you coordinate
them. it's just luck they are run in order for you - make your system
very busy and you will see this.

regards.

a @ http://codeforpeople.com/
 
R

Reacher

the order threads run is *always* undefined unless you coordinate  
them.  it's just luck they are run in order for you - make your system  
very busy and you will see this.

regards.

a @http://codeforpeople.com/

As our Opearting Systems professor drove this into our brains daily,
so shall I repeat it here: You can make no assumptions about the
relative rate of concurrent processes.
 

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

Similar Threads

[ANN] terminator-0.4.2 0
[ANN] forkoff-0.0.4 0
[ANN] forkoff-1.1.0 0
[ANN] systemu-1.0.0 2
[ANN] systemu-1.2.0 0
[ANN] slave-1.2.1 1
[ANN] sldb-0.1.0 0
problem on waiting exit thread and write on file 2

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top