#!/usr/bin/env python3

from threading import Lock, Thread

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        return cls._instances.setdefault(
            cls, super().__call__(*args, **kwargs)
        )

class Singleton(metaclass=SingletonMeta):

    value = None

    def __init__(self, value):
        self.value = value

def test_singleton(value):
    singleton = Singleton(value)
    print(singleton.value)

if __name__ == "__main__":
    process1 = Thread(target=test_singleton, args=("FOO",))
    process2 = Thread(target=test_singleton, args=("BAR",))
    process1.start()
    process2.start()
