你如何使这个Python字典线程安全?

BuZ*_*uZz 7 python multithreading

我有一个运行的Web服务器Python.服务器是私有的,所以我只希望大约20个用户连接到它.服务器是多线程的(目前有8个核心,因此我猜测了8个线程).

当请求进入时,我能够识别用户.在一些查询中,我需要更新一个简单dictionary用户名 - >布尔形式 .我怎么能让这一个线程安全?

And*_*son 10

您需要创建一个全局锁定对象.

lock = threading.Lock()
Run Code Online (Sandbox Code Playgroud)

然后围绕每个字典访问获取并释放锁.最简单的方法是使用新的(ish)with语法.

with lock:
    dict[key] = value
Run Code Online (Sandbox Code Playgroud)


dbr*_*dbr 6

如果你需要一个锁(以避免Joonas描述的竞争条件),并且仍然坚持使用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()
Run Code Online (Sandbox Code Playgroud)


Joo*_*kka 5

您可能需要也可能不需要使用锁,具体取决于Boolean更新方式。

如果的值Boolean 取决于其先前的值,则无需锁定:编写和读取Python字典本身就是线程安全的(除非:不允许在迭代时编写 -但这也不在单线程中允许) )。内存可见性与volatile某些语言中使用的可见性相似。

本质上不是线程安全的是“读取-修改-写入”序列,从而导致竞争。如果的值Boolean 确实取决于其先前的值,则必须使用锁,因为否则线程A可能首先读取该值,然后线程B可以对其进行更改,然后线程A将基于过期的值再次对其进行更改。从...开始。