Use only some of the thread pool threads for gRPC
diff --git a/src/node/ext/completion_queue_async_worker.cc b/src/node/ext/completion_queue_async_worker.cc
index 8de7db6..8db7229 100644
--- a/src/node/ext/completion_queue_async_worker.cc
+++ b/src/node/ext/completion_queue_async_worker.cc
@@ -43,6 +43,8 @@
 namespace grpc {
 namespace node {
 
+const int max_queue_threads = 2;
+
 using v8::Function;
 using v8::Handle;
 using v8::Object;
@@ -51,6 +53,9 @@
 
 grpc_completion_queue *CompletionQueueAsyncWorker::queue;
 
+int CompletionQueueAsyncWorker::current_threads;
+int CompletionQueueAsyncWorker::waiting_next_calls;
+
 CompletionQueueAsyncWorker::CompletionQueueAsyncWorker()
     : NanAsyncWorker(NULL) {}
 
@@ -64,17 +69,30 @@
 
 void CompletionQueueAsyncWorker::Next() {
   NanScope();
-  CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
-  NanAsyncQueueWorker(worker);
+  if (current_threads < max_queue_threads) {
+    CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
+    NanAsyncQueueWorker(worker);
+  } else {
+    waiting_next_calls += 1;
+  }
 }
 
 void CompletionQueueAsyncWorker::Init(Handle<Object> exports) {
   NanScope();
+  current_threads = 0;
+  waiting_next_calls = 0;
   queue = grpc_completion_queue_create();
 }
 
 void CompletionQueueAsyncWorker::HandleOKCallback() {
   NanScope();
+  if (waiting_next_calls > 0) {
+    waiting_next_calls -= 1;
+    CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
+    NanAsyncQueueWorker(worker);
+  } else {
+    current_threads -= 1;
+  }
   NanCallback event_callback(GetTagHandle(result->tag).As<Function>());
   Handle<Value> argv[] = {CreateEventObject(result)};