daemonserver.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #!/usr/bin/env python
  2. # Copyright 2010 Google Inc. All Rights Reserved.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. import threading
  16. class DaemonServer(object):
  17. """Base class which manages creation and cleanup of daemon style servers."""
  18. def __enter__(self):
  19. # TODO: Because of python's Global Interpreter Lock (GIL), the threads
  20. # will run on the same CPU. Consider using processes instead because
  21. # the components do not need to communicate with each other. On Linux,
  22. # "taskset" could be used to assign each process to specific CPU/core.
  23. # Of course, only bother with this if the processing speed is an issue.
  24. # Some related discussion: http://stackoverflow.com/questions/990102/python-
  25. # global-interpreter-lock-gil-workaround-on-multi-core-systems-using-tasks
  26. thread = threading.Thread(target=self.serve_forever)
  27. thread.daemon = True # Python exits when no non-daemon threads are left.
  28. thread.start()
  29. return self
  30. def __exit__(self, unused_exc_type, unused_exc_val, unused_exc_tb):
  31. self.cleanup()