Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   system() and `` problem in Multithreading (http://www.velocityreviews.com/forums/t850761-system-and-problem-in-multithreading.html)

Lee Youser 06-05-2008 04:23 PM

system() and `` problem in Multithreading
 
[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







ara.t.howard 06-05-2008 07:19 PM

Re: system() and `` problem in Multithreading
 

On Jun 5, 2008, at 10:23 AM, Lee Youser wrote:

> 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/
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama





Reacher 06-05-2008 07:58 PM

Re: system() and `` problem in Multithreading
 
On Jun 5, 2:19*pm, "ara.t.howard" <ara.t.how...@gmail.com> wrote:
> On Jun 5, 2008, at 10:23 AM, Lee Youser wrote:
>
> > 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/
> --
> we can deny everything, except that we have the possibility of being *
> better. simply reflect on that.
> h.h. the 14th dalai lama


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.


All times are GMT. The time now is 03:54 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.