Я не очень давно работаю с ruby но почти в первые дни появилась острая нужда запускать долго играющие функции, которые не должны блокировать работу основной программы.
Готового и простого решения я не нашел, посему начал изобретать велосипед.
На данный момент библиотека позволяет:
Пример использования:
Пощупать можно тут: GitHub
TODO
P.S. Интересно послушать гуру :)
UPD
Представленные выше примеры, не есть способ использования, это проверка тредов, кусок старого теста.
В действительности можно сделать так:
Готового и простого решения я не нашел, посему начал изобретать велосипед.
На данный момент библиотека позволяет:
- организовывать асинхронные вызовы методов вашего класса
- гарантирует выполнение всех потоков перед выходом из программы
Пример использования:
Copy Source | Copy HTML
- class YourClass1
- def hello
- p 'start'
- p 'list ' + Thread.list.join( ' ')
- p 'main ' + Thread.main.to_s
- p 'this ' + Thread.current.to_s
- p 'end'
- end
- end
-
- af = AsyncFu.new(YourClass1.new)
- af.hello
Copy Source | Copy HTML
- class YourClass2 < AsyncFu
- def hello
- p 'start'
- p 'list ' + Thread.list.join( ' ')
- p 'main ' + Thread.main.to_s
- p 'this ' + Thread.current.to_s
- p 'end'
- end
- end
-
- ai = YourClass2.new
- ai.hello
Пощупать можно тут: GitHub
TODO
- Сделать вменяемые callback, дабы можно было отслеживать состояние.
- Сделать обработку исключений и возврат статусов.
- Сделать возможность использования mixin стиля.
P.S. Интересно послушать гуру :)
UPD
Представленные выше примеры, не есть способ использования, это проверка тредов, кусок старого теста.
В действительности можно сделать так:
Copy Source | Copy HTML
- require 'rubygems'
- require 'async_fu'
-
- class Some
- def grep(query, path)
- list = `grep -rne '#{query}' #{path}`
- File.new( '/tmp/grep.log', 'w' ).write list
- end
- def tick
- loop{
- sleep 1
- p 'tick'
- }
- end
- def tack
- loop{
- sleep 2
- p 'tack'
- }
- end
- end
-
- test = AsyncFu.new(Some.new)
- test.tick
- test.grep( 'thread.rb', '/usr/local/lib' )
- test.tack