Multiprocessing utilities
"Shared" version of the standard Lock() and RLock() classes found in
the multiprocessing/threading modules.
Shared locks can be acquired in two modes, shared and exclusive.
Any number of processes/threads can acquire the lock in shared mode.
Only one process/thread can acquire the lock in exclusive mode.
A process/thread attempting to exclusively acquire the lock will block until the lock has been released by all other threads/processes.
A process/thread attempting to shared acquire the lock will only block while there is an exclusive lock.
This is a little like database locks, which can be acquired for shared reading, or exclusive writing.
lock = multiprocessing_utils.SharedLock()
def exclusive_worker():
with lock.exclusive():
# this code will only run when no other
# process/thread in a lock context
def shared_worker():
with lock:
# this code will run so long as no
# thread/process holds an exclusive lock
A process (and thread) safe version of threading.local()
l = multiprocessing_utils.local()
l.x = 1
def f():
try:
print(l.x)
except Attribute:
print("x not set")
f() # prints "1"
threading.Thread(target=f).start() # prints "x not set"
multiprocessing.Process(target=f).start() # prints "x not set"
A standard threading.local() instance created before forking (via
os.fork() or multiprocessing.Process()) will be "local" as expected
and the new process will have access to any data set before the fork.
Using a standard threading.local() in the example above would yield:
f() # prints "1" threading.Thread(target=f).start() # prints "x not set" multiprocessing.Process(target=f).start() # prints "1" :(