diff --git a/github_webhook/webhook.py b/github_webhook/webhook.py index 4005beb..17dbcb8 100644 --- a/github_webhook/webhook.py +++ b/github_webhook/webhook.py @@ -4,6 +4,7 @@ import logging import six +import concurrent.futures from flask import abort, request @@ -16,10 +17,10 @@ class Webhook(object): :param secret: Optional secret, used to authenticate the hook comes from Github """ - def __init__(self, app, endpoint='/postreceive', secret=None): + def __init__(self, app, endpoint='/postreceive', secret=None, max_workers=2): app.add_url_rule(endpoint, view_func=self._postreceive, methods=['POST']) - + self._executor = concurrent.futures.ThreadPoolExecutor(max_workers) self._hooks = collections.defaultdict(list) self._logger = logging.getLogger('webhook') if secret is not None and not isinstance(secret, six.binary_type): @@ -70,7 +71,7 @@ def _postreceive(self): '%s (%s)', _format_event(event_type, data), _get_header('X-Github-Delivery')) for hook in self._hooks.get(event_type, []): - hook(data) + self._executor.submit(hook, data) return '', 204 diff --git a/setup.py b/setup.py index 647a1e3..786fba2 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ author_email="achamberlai9@bloomberg.net, fphillips7@bloomberg.net, dkiss1@bloomberg.net, dbeer1@bloomberg.net", license='Apache 2.0', packages=["github_webhook"], - install_requires=['flask', 'six'], + install_requires=['flask', 'six', 'future;python_version<"3"'], tests_require=['mock', 'nose'], classifiers=[