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