From fa2d870b09bb940b9c4192f47d4e5e024e23fa43 Mon Sep 17 00:00:00 2001 From: David Shrewsbury Date: Mon, 5 Nov 2012 13:33:20 -0500 Subject: [PATCH] Use event-driven task distribution. Use Green Threads via the eventlet module to execute the server tasks. So far, the only task is the Gearman worker. This is another step forward to being able to execute a Gearman client task. Change-Id: I4824753d3a3a07ad8ccf521a957efd41150b0752 --- libra/worker/main.py | 45 +++++++++++++++++++++++++++++--------------- tools/pip-requires | 1 + 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/libra/worker/main.py b/libra/worker/main.py index d4ad53ec..ba10cf8a 100644 --- a/libra/worker/main.py +++ b/libra/worker/main.py @@ -12,6 +12,9 @@ # License for the specific language governing permissions and limitations # under the License. +import eventlet +eventlet.monkey_patch() + import daemon import daemon.pidfile import grp @@ -24,24 +27,32 @@ from libra.worker.drivers.base import known_drivers from libra.worker.drivers.haproxy.services_base import haproxy_services -class Server(object): +class EventServer(object): """ Encapsulates server activity so we can run it in either daemon or non-daemon mode. """ - def __init__(self, logger, servers, reconnect_sleep): + def __init__(self, logger): self.logger = logger - self.driver = None - self.servers = servers - self.reconnect_sleep = reconnect_sleep - def main(self): - """ Main method of the server. """ - config_manager(self.logger, - self.driver, - self.servers, - self.reconnect_sleep) + def main(self, tasks): + """ + Main method of the server. + + tasks + A tuple with two items: a function name, and a tuple with + that function's arguments. + """ + + thread_list = [] + + for task, args in tasks: + thread_list.append(eventlet.spawn(task, *args)) + + for thd in thread_list: + thd.wait() + self.logger.info("Shutting down") @@ -98,11 +109,15 @@ def main(): driver = driver_class() logger.info("Job server list: %s" % args.server) - server = Server(logger, args.server, args.reconnect_sleep) - server.driver = driver + server = EventServer(logger) + + # Tasks to execute in parallel + task_list = [ + (config_manager, (logger, driver, args.server, args.reconnect_sleep)) + ] if args.nodaemon: - server.main() + server.main(task_list) else: context = daemon.DaemonContext( working_directory='/etc/haproxy', @@ -124,6 +139,6 @@ def main(): return 1 with context: - server.main() + server.main(task_list) return 0 diff --git a/tools/pip-requires b/tools/pip-requires index b9c1d43a..c7aa2991 100644 --- a/tools/pip-requires +++ b/tools/pip-requires @@ -1,3 +1,4 @@ +eventlet gearman python-daemon requests