How would you make this Python Dictionary thread-safe?

前端 未结 5 626
无人及你
无人及你 2021-01-02 10:50

I have a Web Server running in Python. The server is private, so i only expect around 20 users to connect to it. The server is multi-threaded (8 cores at the mo

相关标签:
5条回答
  • 2021-01-02 11:28

    Use threading.LOCK.acquire() before updating the dictionary and use threading.LOCK.release(), once you are done updating it.

    0 讨论(0)
  • 2021-01-02 11:34

    If you need a lock (to avoid the race conditions Joonas described), and are stuck with Python 2.4,

    import threading
    lock = threading.Lock()
    
    shared_dict = {}
    
    def do_thing(user, value):
        lock.acquire()
        try:
            shared_dict[user] = value
        finally:
            # Always called, even if exception is raised in try block
            lock.release()
    
    0 讨论(0)
  • 2021-01-02 11:34

    You'll need to create a global lock object.

    lock = threading.Lock()
    

    Then around each access of the dictionary acquire and release the lock. The simplest way to do this is with the new(ish) with syntax.

    with lock:
        dict[key] = value
    
    0 讨论(0)
  • 2021-01-02 11:46

    You don´t need to lock dictionary to this operation, because this operation is atomic, and GIL take care this for you. Unless you have operations like read-change-write, don't worry.

    0 讨论(0)
  • 2021-01-02 11:49

    You may or may not need to use a lock, depending on how the Boolean is updated.

    If the value of the Boolean doesn't depend on its previous value, then no lock is needed: writing and reading a Python dictionary is thread-safe by itself (except: writing while iterating is not allowed - but that's not allowed in single thread either). The memory visibility is similar to what would be achieved using volatile in some languages.

    What's inherently not thread-safe is the "read-modify-write" -sequence, resulting in a race condition. If the value of the Boolean does depend on its previous value, then you have to use a lock, because otherwise thread A could first read the value, then thread B could change it, and then A would change it again, based on outdated value to start with.

    0 讨论(0)
提交回复
热议问题