146 lines
3.1 KiB
ReStructuredText
146 lines
3.1 KiB
ReStructuredText
Examples
|
|
========
|
|
|
|
------------------
|
|
Interprocess locks
|
|
------------------
|
|
|
|
.. note::
|
|
|
|
Launch multiple of these at the same time to see the lock(s) in action.
|
|
|
|
.. code-block:: python
|
|
|
|
import time
|
|
|
|
import fasteners
|
|
|
|
@fasteners.interprocess_locked('/tmp/tmp_lock_file')
|
|
def test():
|
|
for i in range(10):
|
|
print('I have the lock')
|
|
time.sleep(1)
|
|
|
|
print('Waiting for the lock')
|
|
test()
|
|
|
|
.. code-block:: python
|
|
|
|
import time
|
|
|
|
import fasteners
|
|
|
|
def test():
|
|
for i in range(10):
|
|
with fasteners.InterProcessLock('/tmp/tmp_lock_file'):
|
|
print('I have the lock')
|
|
time.sleep(1)
|
|
|
|
test()
|
|
|
|
.. code-block:: python
|
|
|
|
import time
|
|
|
|
import fasteners
|
|
|
|
def test():
|
|
a_lock = fasteners.InterProcessLock('/tmp/tmp_lock_file')
|
|
for i in range(10):
|
|
gotten = a_lock.acquire(blocking=False)
|
|
try:
|
|
if gotten:
|
|
print('I have the lock')
|
|
time.sleep(0.2)
|
|
else:
|
|
print('I do not have the lock')
|
|
time.sleep(0.1)
|
|
finally:
|
|
if gotten:
|
|
a_lock.release()
|
|
|
|
test()
|
|
|
|
----------------------------
|
|
Reader/writer (shared) locks
|
|
----------------------------
|
|
|
|
.. code-block:: python
|
|
|
|
import random
|
|
import threading
|
|
import time
|
|
|
|
import fasteners
|
|
|
|
def read_something(ident, rw_lock):
|
|
with rw_lock.read_lock():
|
|
print("Thread %s is reading something" % ident)
|
|
time.sleep(1)
|
|
|
|
def write_something(ident, rw_lock):
|
|
with rw_lock.write_lock():
|
|
print("Thread %s is writing something" % ident)
|
|
time.sleep(2)
|
|
|
|
rw_lock = fasteners.ReaderWriterLock()
|
|
threads = []
|
|
for i in range(0, 10):
|
|
is_writer = random.choice([True, False])
|
|
if is_writer:
|
|
threads.append(threading.Thread(target=write_something,
|
|
args=(i, rw_lock)))
|
|
else:
|
|
threads.append(threading.Thread(target=read_something,
|
|
args=(i, rw_lock)))
|
|
|
|
try:
|
|
for t in threads:
|
|
t.start()
|
|
finally:
|
|
while threads:
|
|
t = threads.pop()
|
|
t.join()
|
|
|
|
--------------
|
|
Lock decorator
|
|
--------------
|
|
|
|
.. code-block:: python
|
|
|
|
import threading
|
|
|
|
import fasteners
|
|
|
|
class NotThreadSafeThing(object):
|
|
def __init__(self):
|
|
self._lock = threading.Lock()
|
|
|
|
@fasteners.locked
|
|
def do_something(self):
|
|
print("Doing something in a thread safe manner")
|
|
|
|
o = NotThreadSafeThing()
|
|
o.do_something()
|
|
|
|
--------------------
|
|
Multi-lock decorator
|
|
--------------------
|
|
|
|
.. code-block:: python
|
|
|
|
import threading
|
|
|
|
import fasteners
|
|
|
|
class NotThreadSafeThing(object):
|
|
def __init__(self):
|
|
self._locks = [threading.Lock(), threading.Lock()]
|
|
|
|
@fasteners.locked(lock='_locks')
|
|
def do_something(self):
|
|
print("Doing something in a thread safe manner")
|
|
|
|
o = NotThreadSafeThing()
|
|
o.do_something()
|