Ist obj in a_list
Thread-sicher, während a_list
in einem anderen Thread geändert werden kann?
Hier finden Sie eine umfassende, aber nicht erschöpfende Liste mit Beispielen von list
-Operationen und ob sie Thread-sicher sind oder nicht, jedoch konnte ich keine Referenz für das in
Sprachkonstrukt finden.
Im Hinblick auf die Python-Implementierung verwende ich CPython, aber Antworten für andere Implementierungen wären auch für die Community hilfreich.
Ich gehe davon aus, dass Sie CPython hier verwenden.
Vorausgesetzt, es gibt kein benutzerdefiniertes __contains__
oder __iter__
hook, das zurück in Python oder fällt, verwenden die Werte, die Sie gegen in getestet haben, benutzerdefinierte __eq__
hooks In Python-Code implementiert, kann der in
-Operator vollständig in C behandelt werden und ist nur ein Opcode.
Dies macht die Operation völlig Thread-sicher; Python-Threads wechseln nur zwischen Opcodes; Die GIL (Global Interpreter Lock) entsperrt normalerweise nur zwischen Opcodes.
Wenn Sie in
für einen benutzerdefinierten C-Typ verwenden, der die GIL entsperrt, wenn das Containment getestet wird, ist das nicht threadsicher.
Mit anderen Worten: Der Bytecode-Test in
ist gesperrt, aber wenn der Operator Python-Code aufrufen muss (durch __contains__
, Iterieren mit __iter__
, wenn keine __contains__
-Implementierung verfügbar ist oder die Werte test sind) gegen __eq__
hooks in Python implementiert), dann ist die Operation nicht Thread-sicher.
Bei anderen Python-Implementierungen kann die Verarbeitung von Threads stark variieren. Natürlich haben Jython und IronPython keine GIL, und Sie sollten davon ausgehen, dass die Operation nicht threadsicher ist.
Tags und Links python thread-safety list in-operator