A @synchronized decorator for synchronising classes or methods, similar to Java's synchronized keyword
A synchronized class is a class in which methods can only be executed sequentially.
For example, because only one method of SyncSleeper can run at a time, the following script will take 3s to run - instead of 2s in the unsynchronized case:
import time
from multiprocessing import Process
from pynchronized import synchronized
@synchronized
class SyncSleeper:
def sleep_1s(self):
time.sleep(1)
def sleep_2s(self):
time.sleep(2)
sleeper = SyncSleeper()
processes = [
Process(target=sleeper.sleep_1s, deamon=True),
Process(target=sleeper.sleep_2s, deamon=True),
]
for p in processes: p.start()
for p in processes: p.join()Similarly, a there can be only one instance of a synchronized method executing at any time. The following script will take 4s to run instead of 5s if it were a synchronized class instead or 2s in an unsynchronized case:
import time
from multiprocessing import Process
from pynchronized import synchronized
class SyncSleeper:
def sleep_1s(self):
time.sleep(1)
@synchronized
def sleep_2s(self):
time.sleep(2)
sleeper = SyncSleeper()
processes = [
Process(target=sleeper.sleep_1s, daemon=True),
Process(target=sleeper.sleep_2s, daemon=True),
Process(target=sleeper.sleep_2s, daemon=True),
]
for p in processes: p.start()
for p in processes: p.join()There are two decorators available, one for processes and the other one for threads. Use @synchronized for multiprocessing and @synchronized_thread for threading as the thread version will be slightly more performant when using threads.