From: Lee Youser Date: 2008-06-06T01:23:54+09:00 Subject: system() and `` problem in Multithreading --------------070608000501030602000600 Content-Type: text/plain; charset=GB2312 Content-Transfer-Encoding: 7bit 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 --------------070608000501030602000600--