_memory.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 __future__ import absolute_import, division, print_function
  8. from zope.interface import implementer
  9. from . import IWorker
  10. from ._convenience import Quit
  11. NoMoreWork = object()
  12. @implementer(IWorker)
  13. class MemoryWorker(object):
  14. """
  15. An L{IWorker} that queues work for later performance.
  16. @ivar _quit: a flag indicating
  17. @type _quit: L{Quit}
  18. """
  19. def __init__(self, pending=list):
  20. """
  21. Create a L{MemoryWorker}.
  22. """
  23. self._quit = Quit()
  24. self._pending = pending()
  25. def do(self, work):
  26. """
  27. Queue some work for to perform later; see L{createMemoryWorker}.
  28. @param work: The work to perform.
  29. """
  30. self._quit.check()
  31. self._pending.append(work)
  32. def quit(self):
  33. """
  34. Quit this worker.
  35. """
  36. self._quit.set()
  37. self._pending.append(NoMoreWork)
  38. def createMemoryWorker():
  39. """
  40. Create an L{IWorker} that does nothing but defer work, to be performed
  41. later.
  42. @return: a worker that will enqueue work to perform later, and a callable
  43. that will perform one element of that work.
  44. @rtype: 2-L{tuple} of (L{IWorker}, L{callable})
  45. """
  46. def perform():
  47. if not worker._pending:
  48. return False
  49. if worker._pending[0] is NoMoreWork:
  50. return False
  51. worker._pending.pop(0)()
  52. return True
  53. worker = MemoryWorker()
  54. return (worker, perform)