Python中多线程并发修改字典唯一键条目是否安全?
问题
我执行如下代码,对字典的操作是否安全?
import threading as thread def do_operation(operation, results): results[operation.unique_name] = operation.get_result() results = {} for operation in operations: thread.Thread(target=do_operation, args=(operation, results)).run()
解答
- 你当前写的代码本身不存在线程安全问题:你调用的是
Thread.run()方法,该方法会直接在当前主线程同步执行目标函数,并没有启动新的子线程,整个逻辑是串行执行所有操作,对字典的写入完全安全。 - 如果你是笔误,实际要调用
Thread.start()启动多线程并发执行:- 仅针对CPython实现来说,单个字典赋值操作
results[key] = value是原子操作,只要所有线程写入的operation.unique_name互不重复、且没有其他线程同时对这个字典做删除、遍历、覆盖同一个key的操作,就不会出现字典内部结构损坏、数据写入异常的问题。 - 上述原子性是CPython的GIL带来的实现细节,不属于Python语言的官方规范,其他Python解释器(如PyPy)不保证该操作的原子性。如果需要跨解释器兼容、或者后续会新增其他字典操作,建议加线程锁保证安全。
- 仅针对CPython实现来说,单个字典赋值操作
内容的提问来源于stack exchange,提问作者rpecka
相关产品推荐
相关产品推荐

