Является ли Python re потокобезопасным?
Я попробовал поиск по Google, но не получил авторитетного ответа.
Может кто-то подтвердить, что модуль re
http://docs.python.org/2/library/re.html
является потокобезопасным?
Более конкретно, какие функции есть и которые не являются?
Кроме того, могу ли я повторно использовать один глобальный скомпилированный объект re для sub
, search
и т.д. безопасно через потоки?
Похоже, что до сих пор нет четкого ответа?
Хорошо, более конкретный пример:
class MyClass:
GLOBAL_VAR = re.compile(...)
def clean(self, value):
return MyClass.GLOBAL_VAR.sub('', value)
Будет ли это работать, как ожидалось, когда несколько потоков одновременно будут очищаться?
Ответы
Ответ 1
Я не думаю, что есть авторитетный ответ, отличный от поиска в источнике, который дает вам ответы на существующие версии Python, но не обязательно на будущие, поскольку по крайней мере некоторые части некоторых версий модуля регулярных выражений записаны в C (по крайней мере, для CPython, например, для Jython, кто знает?), и никто не сделал никаких promises о них.
На практике я не видел никаких бит кода RE, которые не являются потокобезопасными, а ваш более поздний пример с вызовом GLOBAL_VAR.sub
"почти наверняка" поточно-безопасным. Но... там все еще было чертово отсутствие письменности promises.: -)
Ответ 2
Да, они потокобезопасны. Поскольку между функциями есть только словарь _cache, каждая функция будет использовать его для поиска сгенерированного значения, и если значение не было в _cache, функции будут генерировать значение и помещать его в _cache, и он не будет нарушать безопасность потока