Podder now runs with an associated thread pool.

This allows podder to parallelize requests to docker.

Change-Id: Iacae80a63bcd68ef7b471d63dbb41b7314d3af20
diff --git a/common/utils/dockerhelpers.py b/common/utils/dockerhelpers.py
index 9708e9e..ffd3601 100644
--- a/common/utils/dockerhelpers.py
+++ b/common/utils/dockerhelpers.py
@@ -18,6 +18,7 @@
 Some docker related convenience functions
 """
 from datetime import datetime
+from concurrent.futures import ThreadPoolExecutor
 
 import os
 import socket
@@ -78,9 +79,8 @@
     try:
         docker_cli = Client(base_url=docker_socket)
         info = docker_cli.inspect_container(id)
-
     except Exception, e:
-        log.exception('failed', e=e)
+        log.debug('failed: {}'.format(e.message))
         raise
 
     return info
@@ -162,9 +162,11 @@
     This class handles the api session and allows for it to
     be terminated.
     """
-    def __init__(self):
+    def __init__(self, threads=1):
         self.client = CustomClient(base_url=docker_socket)
         self.events = self.client.events(decode=True)
+        log.info("Starting event processor with {} threads".format(threads))
+        self.exec_service = ThreadPoolExecutor(max_workers=threads)
 
     def stop_listening(self):
         """
@@ -214,7 +216,8 @@
 
             status = get_status(event)
             if status in handlers:
-                handlers[get_status(event)](event, data, handlers['podder_config'])
+                self.exec_service.submit(handlers[get_status(event)], event,
+                                         data, handlers['podder_config'])
             else:
                 log.debug("No handler for {}; skipping...".format(status))