Ist pythons "in" -Sprache threadsicher für Listen?

8

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.

    
Jonathan 01.11.2013, 13:31
quelle

1 Antwort

15

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.

    
Martijn Pieters 01.11.2013, 13:37
quelle