2014-07-14 49 views
2

如果d是一本字典,那么显然如果在Python的`list(some_dictionary)`线程安全吗?

[k for k in d] 

评估另一个线程修改d CPython的不喜欢它。怎么样使用

list(d) 

取而代之?这是线程安全的吗?

+1

不要依赖CPython的实现细节。使用实际同步。 – user2357112

+1

如果*相同*线程在该条件下修改了'd',Python不会喜欢它。 –

回答

6

我完全用@ user2357112,这是一个实现细节,你不应该依赖它。但为了回答这个问题:相关的listdict方法用C语言编写,因此调用是单字节码操作,并且the code不直接或间接释放GIL,据我所知。因此在当前CPython中没有其他Python线程可以中断list调用并修改d

注意,这打破了如果任list已换上别的东西,或d不是实际诚为本,以神写的C.另外请注意,“是写在C” dictobject是不是充分条件,例如许多集合操作调用比较/散列方法,从而执行任意Python代码,从而允许释放GIL。

+1

值得一提的是'dict'迭代器不释放GIL。在迭代器用Python编写的对象上调用'list',或者其迭代器可能调用Python代码的对象可以被GIL版本中断。 – user2357112

+0

@ user2357112好点,补充说明以及其他警告和澄清。 – delnan

+0

感谢你们俩。我当然同意明确锁定会更好,尤其是因为依赖于'd'的类型。 –