README.md in em-synchrony-0.1.2 vs README.md in em-synchrony-0.1.4
- old
+ new
@@ -1,72 +1,87 @@
# EM-Synchrony
+http://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers
+
Collection of convenience classes and patches to common EventMachine clients to
make them Fiber aware and friendly. Word of warning: even though fibers have been
backported to Ruby 1.8.x, these classes assume Ruby 1.9 (if you're using fibers
-in production, you should be on 1.9 anyway)
+in production, you should be on 1.9 anyway)
Features:
* Fiber aware connection pool with sync/async query support
* Multi request interface which accepts any callback enabled client
+ * Fibered iterator to allow concurrency control & mixing of sync / async
* em-http-request: .get, etc are synchronous, while .aget, etc are async
* em-mysqlplus: .query is synchronous, while .aquery is async
* remcached: .get, etc, and .multi_* methods are synchronous
## Example with async em-http client:
- EventMachine.run do
- Fiber.new {
- res = EventMachine::HttpRequest.new("http://www.postrank.com").get
+ EventMachine.synchrony do
+ res = EventMachine::HttpRequest.new("http://www.postrank.com").get
- p "Look ma, no callbacks!"
- p res
+ p "Look ma, no callbacks!"
+ p res
- EventMachine.stop
- }.resume
+ EventMachine.stop
end
-## Example with multi-request async em-http client:
+## EM Iterator & mixing sync / async code
- EventMachine.run do
- Fiber.new {
-
- multi = EventMachine::Synchrony::Multi.new
- multi.add :a, EventMachine::HttpRequest.new("http://www.postrank.com").aget
- multi.add :b, EventMachine::HttpRequest.new("http://www.postrank.com").apost
- res = multi.perform
-
- p "Look ma, no callbacks, and parallel requests!"
- p res
+ EM.synchrony do
+ concurrency = 2
+ urls = ['http://url.1.com', 'http://url2.com']
- EventMachine.stop
- }.resume
+ # iterator will execute async blocks until completion, .each, .inject also work!
+ results = EM::Synchrony::Iterator.new(urls, concurrency).map do |url, iter|
+
+ # fire async requests, on completion advance the iterator
+ http = EventMachine::HttpRequest.new(url).aget
+ http.callback { iter.return(http) }
+ end
+
+ p results # all completed requests
+
+ EventMachine.stop
end
## Example connection pool shared by a fiber:
- EventMachine.run do
-
+ EventMachine.synchrony do
db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
EventMachine::MySQL.new(host: "localhost")
end
- Fiber.new {
- start = now
+ start = now
- multi = EventMachine::Synchrony::Multi.new
- multi.add :a, db.aquery("select sleep(1)")
- multi.add :b, db.aquery("select sleep(1)")
- res = multi.perform
+ multi = EventMachine::Synchrony::Multi.new
+ multi.add :a, db.aquery("select sleep(1)")
+ multi.add :b, db.aquery("select sleep(1)")
+ res = multi.perform
- p "Look ma, no callbacks, and parallel requests!"
- p res
+ p "Look ma, no callbacks, and parallel MySQL requests!"
+ p res
- EventMachine.stop
- }.resume
+ EventMachine.stop
end
+
+## Example with multi-request async em-http client:
+
+ EventMachine.synchrony do
+ multi = EventMachine::Synchrony::Multi.new
+ multi.add :a, EventMachine::HttpRequest.new("http://www.postrank.com").aget
+ multi.add :b, EventMachine::HttpRequest.new("http://www.postrank.com").apost
+ res = multi.perform
+
+ p "Look ma, no callbacks, and parallel HTTP requests!"
+ p res
+
+ EventMachine.stop
+ end
+
# License
(The MIT License)
Copyright (c) 2010 Ilya Grigorik
\ No newline at end of file