Index: pkg/pool/README.md |
diff --git a/pkg/pool/README.md b/pkg/pool/README.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..898728867ecdf306cf82e2ad985458c880ca614f |
--- /dev/null |
+++ b/pkg/pool/README.md |
@@ -0,0 +1,53 @@ |
+The pool package exposes a `Pool` class which makes it easy to manage a limited |
+pool of resources. |
+ |
+The easiest way to use a pool is by calling `withResource`. This runs a callback |
+and returns its result, but only once there aren't too many other callbacks |
+currently running. |
+ |
+```dart |
+// Create a Pool that will only allocate 10 resources at once. After 30 seconds |
+// of inactivity with all resources checked out, the pool will throw an error. |
+final pool = new Pool(10, timeout: new Duration(seconds: 30)); |
+ |
+Future<String> readFile(String path) { |
+ // Since the call to [File.readAsString] is within [withResource], no more |
Bob Nystrom
2014/07/17 22:09:14
This example would be clearer if you did something
nweiz
2014/07/17 22:56:55
I'm not sure how I'd do that without adding a lot
|
+ // than ten files will be open at once. |
+ return pool.withResource(() => return new File(path).readAsString()); |
+} |
+``` |
+ |
+For more fine-grained control, the user can also explicitly request generic |
+`PoolResource` objects that can later be released back into the pool. This is |
+what `withResource` does under the covers: requests a resource, then releases it |
+once the callback completes. |
+ |
+`Pool` ensures that only a limited number of resources are allocated at once. |
+It's the caller's responsibility to ensure that the corresponding physical |
+resource is only consumed when a `PoolResource` is allocated. |
+ |
+```dart |
+class PooledFile implements RandomAccessFile { |
+ final RandomAccessFile _file; |
+ final PoolResource _resource; |
+ |
+ static Future<PooledFile> open(String path) { |
+ return pool.request().then((resource) { |
+ return new File(path).open().then((file) { |
+ return new PooledFile._(file, resource); |
+ }); |
+ }); |
+ } |
+ |
+ PooledFile(this._file, this._resource); |
+ |
+ // ... |
+ |
+ Future<RandomAccessFile> close() { |
+ return _file.close.then((_) { |
+ _resource.release(); |
+ return this; |
+ }); |
+ } |
+} |
+``` |