homer512

rwlock write-priority

Jan 1st, 2026
4,055
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.44 KB | None | 0 0
  1. from contextlib import contextmanager
  2. from threading import Condition, Thread, Lock
  3. import time
  4.  
  5. class SharedLock:
  6.     def __init__(self):
  7.         self._lock = Lock()
  8.         self._readcond = Condition(self._lock)
  9.         self._writecond = Condition(self._lock)
  10.         self._readers = 0
  11.         self._writers_waiting = 0
  12.  
  13.     @contextmanager
  14.     def __call__(self, lock_type: str):
  15.         if lock_type == 'shared':
  16.             with self._lock:
  17.                 while self._writers_waiting:
  18.                     self._readcond.wait()
  19.                 self._readers += 1
  20.             yield self
  21.             with self._lock:
  22.                 self._readers -= 1
  23.                 if not self._readers:
  24.                     self._writecond.notify()
  25.         elif lock_type == 'exclusive':
  26.             with self._lock:
  27.                 self._writers_waiting += 1
  28.                 while self._readers:
  29.                     self._writecond.wait()
  30.                 self._writers_waiting -= 1
  31.                 yield self
  32.                 if self._writers_waiting:
  33.                     self._writecond.notify()
  34.                 else:
  35.                     self._readcond.notify_all()
  36.         else:
  37.             raise ValueError(f'Invalid lock_type {lock_type!r}')
  38.  
  39. if __name__ == '__main__':
  40.     shared_lock = SharedLock()
  41.  
  42.     def reader():
  43.         with shared_lock('shared'):
  44.             print('start reading', time.time())
  45.             time.sleep(1)
  46.             print('end reading', time.time())
  47.  
  48.         # Give writer thread a chance to acquire exclusive use:
  49.         #time.sleep(.1)
  50.  
  51.         #with shared_lock('shared'):
  52.         #    print('start reading', time.time())
  53.         #    time.sleep(1)
  54.         #    print('end reading', time.time())
  55.  
  56.     def writer():
  57.         # Give reader threads a chance to acquire shared use:
  58.         time.sleep(.1)
  59.  
  60.         with shared_lock('exclusive'):
  61.             print('start writing', time.time())
  62.             time.sleep(1)
  63.             print('end writing', time.time())
  64.  
  65.     def test():
  66.         reader_threads = [
  67.             Thread(target=reader) for _ in range(1)
  68.         ]
  69.  
  70.         writer_threads = [
  71.             Thread(target=writer) for _ in range(2)
  72.         ]
  73.  
  74.         for t in reader_threads:
  75.             t.start()
  76.         for t in writer_threads:
  77.             t.start()
  78.  
  79.         for t in reader_threads:
  80.             t.join()
  81.         for t in writer_threads:
  82.             t.join()
  83.  
  84.     test()
  85.  
Advertisement