Re: n Prozesse starten - Computer Language Shootout

Michael Neumann <[email protected]> Mon, 18 Oct 2004 01:00:21 +0200
Newsgroups gmane.comp.lang.ruby.german
Message-ID <[email protected]>
On Sat, Oct 16, 2004 at 11:39:56AM +0200, Enrico Schwass wrote:
> threads =3D []
>=20
> # Anzahl der Threads als Argument
>=20
> n =3D ARGV[0].to_i
>=20
> # Condition variable
>=20
> check =3D 0
>=20
> for t in 1..n
>  threads << Thread.new(t) { |my_t|
>    puts "Running " + my_t.to_s
>    loop do
>      break if my_t =3D=3D check
>    end
>    puts "Finishing " + my_t.to_s
>  }
> end
>=20
> # Beende zuf=E4llig gew=E4hlte Threads
>=20
> loop {
>=20
>    # ohne die 0
>  check =3D rand(n+1)
>=20
>    # einer l=E4uft immer
>  break if Thread.list.length =3D=3D 1
> }
>=20
> puts "All threads finished"


Weisst du warum das so langsam ist? Du solltest keine Zufallszahlen=20
verwenden. Denn, dann kannst du lange warten bis alle beendet sind.
Ausserdem, es l=E4uft ja immer nur ein Thread, und es kann gut sein, das
du "check" mehrmals zuweist, bevor =FCberhaupt ein anderer Thread an die
Reihe kommt um zu pr=FCfen ob er sich nun beenden soll.

Ich habe das ganze mal mit Mutexes geschrieben:

  require 'thread'

  n =3D ARGV[0].to_i

  (1..n).map {
    mutex =3D Mutex.new=20
    mutex.lock
    Thread.new(mutex) {|m| m.synchronize {} }
    mutex
  }.each {|m| m.unlock }

  print n

Oder eben noch k=FCrzer und schneller:

  n =3D ARGV[0].to_i

  (1..n).map { Thread.new { Thread.stop } }.each {|t| t.wakeup}.each {|t|=
 t.join}

  print n

Das erste Beispiel dauert bei mir bei 1000 Threads so ca. 2 Sekunden.
Das zweite nur 1,5. Und wenn du das t.join direkt hinter t.wakeup setzt,
dann ist es nochmals doppelt so schnell.

Nur steigt die Laufzeit leider nicht linear an. D.h. bei 2000 Threads
ist die Laufzeit schon 6-mal so lange.=20

> PS: Hat schon mal einer mit SOAP herumgespielt?? Ich h=E4tte gern einen=
=20
> Server, der
> auf allen Rechnern im Netz meine TODO-Listen abgleicht. Ist zwar mit=20
> Kanonen auf
> Spatzen geschossen, aber mir f=E4llt nichts anderes ein um mich dem The=
ma=20
> Web-Services
> zu n=E4hern :)

Kannst auch XML-RPC verwenden. Ist vielleicht f=FCr den Anfang noch
leichter.

Gr=FCsse,

  Michael