假设代码将在多线程环境中运行,那么在重写魔术方法时是否有必要实现锁,信号灯等?例如,这样的代码是否应该使用锁来防止新值被访问相同缺失键的两个线程覆盖?
import time
class TimesDict(dict):
def __missing__(self, key):
self[key] = value = [time.time()]
return value
这种混淆来自以下事实:许多在线资源(例如http://effbot.org/zone/thread-synchronization.htm#atomic-operations)声称类似dict_['key']
是原子的,但是给定__missing__
示例方法的字节码却使用了多个说明:
dis.dis(TimesDict.__missing__)
5 0 LOAD_GLOBAL 0 (time)
2 LOAD_ATTR 0 (time)
4 CALL_FUNCTION 0
6 BUILD_LIST 1
8 DUP_TOP
10 LOAD_FAST 0 (self)
12 LOAD_FAST 1 (key)
14 STORE_SUBSCR
16 STORE_FAST 2 (value)
6 18 LOAD_FAST 2 (value)
20 RETURN_VALUE
答案 0 :(得分:1)
根据类似的问题https://stackoverflow.com/a/17682555/9075002,如果magic方法是用python编写的,则它不是线程安全的。所有python代码(甚至包括发布GIL的某些C代码)都将存在并发问题。这似乎与本文一致:https://opensource.com/article/17/4/grok-gil。对同一答案的评论清楚地表明,最好假设没有什么是线程安全的,并且文章保证获取锁足够便宜,值得这么做。