Как стать автором
Обновить

Ruby — async_fu, простота использования тредов

Время на прочтение2 мин
Количество просмотров993
Я не очень давно работаю с ruby но почти в первые дни появилась острая нужда запускать долго играющие функции, которые не должны блокировать работу основной программы.

Готового и простого решения я не нашел, посему начал изобретать велосипед.

На данный момент библиотека позволяет:
  • организовывать асинхронные вызовы методов вашего класса
  • гарантирует выполнение всех потоков перед выходом из программы


Пример использования:
Copy Source | Copy HTML
  1. class YourClass1
  2.   def hello
  3.     p 'start'
  4.     p 'list ' + Thread.list.join( ' ')
  5.     p 'main ' + Thread.main.to_s
  6.     p 'this ' + Thread.current.to_s
  7.     p 'end'
  8.   end
  9. end
  10.  
  11. af = AsyncFu.new(YourClass1.new)
  12. af.hello

Copy Source | Copy HTML
  1. class YourClass2 < AsyncFu
  2.   def hello
  3.     p 'start'
  4.     p 'list ' + Thread.list.join( ' ')
  5.     p 'main ' + Thread.main.to_s
  6.     p 'this ' + Thread.current.to_s
  7.     p 'end'
  8.   end
  9. end
  10.  
  11. ai = YourClass2.new
  12. ai.hello

Пощупать можно тут: GitHub

TODO
  • Сделать вменяемые callback, дабы можно было отслеживать состояние.
  • Сделать обработку исключений и возврат статусов.
  • Сделать возможность использования mixin стиля.


P.S. Интересно послушать гуру :)

UPD
Представленные выше примеры, не есть способ использования, это проверка тредов, кусок старого теста.
В действительности можно сделать так:

Copy Source | Copy HTML
  1. require 'rubygems'
  2. require 'async_fu'
  3.  
  4. class Some
  5.     def grep(query, path)
  6.         list = `grep -rne '#{query}' #{path}`
  7.         File.new( '/tmp/grep.log', 'w' ).write list
  8.     end
  9.     def tick
  10.       loop{
  11.         sleep 1
  12.         p 'tick'
  13.       }
  14.     end
  15.     def tack
  16.       loop{
  17.         sleep 2
  18.         p 'tack'
  19.       }
  20.     end
  21. end
  22.  
  23. test = AsyncFu.new(Some.new)
  24. test.tick
  25. test.grep( 'thread.rb', '/usr/local/lib' )
  26. test.tack
Теги:
Хабы:
+2
Комментарии15

Публикации

Изменить настройки темы

Истории

Работа

Ruby on Rails
10 вакансий
Программист Ruby
8 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн