Next Previous Contents

20. <6.2>: Tråder

Ruby har et lett lite trådsystem internt. Det kjører fullstendig inne i fortolkeren, benytter ikke plattformspesifikke tråder, kan ikke dra nytte av flere CPUer og dersom en tråd kaller en C-metode som blokkerer, kan det sulte ut alle de andre trådene også. Men dersom mye av prosesseringen du gjør skjer i Ruby, er de veldig nyttige.

  1| puts 'A1'
  2| traad = Thread.new do
  3|   puts 'B1'
  4|   sleep 2
  5|   puts 'B2'
  6| end
  7| puts 'A2'
  8| puts traad.join  # Vent på at tråden avslutter.
  9| # Utput blir: A1 B1 A2 B2

Merk at når hovedtråden (main) avslutter, drepes alle andre tråder. Man må kalle join eller lignende på trådene om man ønsker å vente på dem.

Ønsker man å returnere en verdi fra en tråd, kan man kalle value i stedet for join.

  1| pi_traad = Thread.new do
  2|   # Regn ut PI til ørten desimaler ...
  3|   puts 'Regne, regne, regne!'
  4|   sleep 5   # Vanlig student-innsats fra denne tråden...
  5|   Math::PI  # ... og tror du ikke den koker også!
  6| end
  7| puts 'Tråden går i bakgrunnen.'
  8| print 'PI er ', pi_traad.value  # Vent på returverdien fra tråden.

NB: Unntak som heves i tråder vil svinne hen i stillhet, med mindre vi eksplisitt venter på at tråden skal avslutte, eller Thread.abort_on_exception er satt til true.


Next Previous Contents