Guest User

Untitled

a guest
Nov 20th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. from functools import wraps
  2. from multiprocessing import Lock
  3.  
  4. def synchronized(tlockname):
  5. """A decorator to place an instance based lock around a method """
  6.  
  7. def _synched(func):
  8. @wraps(func)
  9. def _synchronizer(self, *args, **kwargs):
  10. tlock = self.__getattribute__(tlockname)
  11. tlock.acquire()
  12. try:
  13. return func(self, *args, **kwargs)
  14. finally:
  15. tlock.release()
  16.  
  17. return _synchronizer
  18.  
  19. return _synched
  20.  
  21. class MyStack:
  22. def __init__(self):
  23. self.queue1 = []
  24. self.queue2 = []
  25. self.queue = self.queue1
  26.  
  27. self._lock = Lock()
  28.  
  29. @synchronized('_lock')
  30. def push(self, x):
  31. """
  32. Push element x onto stack.
  33. :type x: int
  34. :rtype: void
  35. """
  36. self.queue.append(x)
  37.  
  38. @synchronized('_lock')
  39. def pop(self):
  40. """
  41. Removes the element on top of the stack and returns that element.
  42. :rtype: int
  43. """
  44. current_queue, tobe_queue = (self.queue1, self.queue2) if self.queue == self.queue1 else (self.queue2, self.queue1)
  45.  
  46. while len(current_queue) > 1:
  47. x = current_queue.pop(0)
  48. tobe_queue.append(x)
  49.  
  50. ret = current_queue.pop(0)
  51. self.queue = tobe_queue
  52. return ret
  53.  
  54. @synchronized('_lock')
  55. def top(self):
  56. """
  57. Get the top element.
  58. :rtype: int
  59. """
  60. current_queue, tobe_queue = (self.queue1, self.queue2) if self.queue == self.queue1 else (self.queue2, self.queue1)
  61.  
  62. while len(current_queue) > 1:
  63. x = current_queue.pop(0)
  64. tobe_queue.append(x)
  65.  
  66. ret = current_queue.pop(0)
  67. tobe_queue.append(ret)
  68. self.queue = tobe_queue
  69. return ret
  70.  
  71. @synchronized('_lock')
  72. def empty(self):
  73. """
  74. Returns whether the stack is empty.
  75. :rtype: bool
  76. """
  77. return len(self.queue) == 0
Add Comment
Please, Sign In to add comment