_memory.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # -*- test-case-name: twisted._threads.test.test_memory -*-
  2. # Copyright (c) Twisted Matrix Laboratories.
  3. # See LICENSE for details.
  4. """
  5. Implementation of an in-memory worker that defers execution.
  6. """
  7. from zope.interface import implementer
  8. from . import IWorker
  9. from ._convenience import Quit
  10. NoMoreWork = object()
  11. @implementer(IWorker)
  12. class MemoryWorker:
  13. """
  14. An L{IWorker} that queues work for later performance.
  15. @ivar _quit: a flag indicating
  16. @type _quit: L{Quit}
  17. """
  18. def __init__(self, pending=list):
  19. """
  20. Create a L{MemoryWorker}.
  21. """
  22. self._quit = Quit()
  23. self._pending = pending()
  24. def do(self, work):
  25. """
  26. Queue some work for to perform later; see L{createMemoryWorker}.
  27. @param work: The work to perform.
  28. """
  29. self._quit.check()
  30. self._pending.append(work)
  31. def quit(self):
  32. """
  33. Quit this worker.
  34. """
  35. self._quit.set()
  36. self._pending.append(NoMoreWork)
  37. def createMemoryWorker():
  38. """
  39. Create an L{IWorker} that does nothing but defer work, to be performed
  40. later.
  41. @return: a worker that will enqueue work to perform later, and a callable
  42. that will perform one element of that work.
  43. @rtype: 2-L{tuple} of (L{IWorker}, L{callable})
  44. """
  45. def perform():
  46. if not worker._pending:
  47. return False
  48. if worker._pending[0] is NoMoreWork:
  49. return False
  50. worker._pending.pop(0)()
  51. return True
  52. worker = MemoryWorker()
  53. return (worker, perform)