Является ли Python re потокобезопасным? - программирование

Является ли 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) 

Будет ли это работать, как ожидалось, когда несколько потоков одновременно будут очищаться?

4b9b3361

Ответ 1

Я не думаю, что есть авторитетный ответ, отличный от поиска в источнике, который дает вам ответы на существующие версии Python, но не обязательно на будущие, поскольку по крайней мере некоторые части некоторых версий модуля регулярных выражений записаны в C (по крайней мере, для CPython, например, для Jython, кто знает?), и никто не сделал никаких promises о них.

На практике я не видел никаких бит кода RE, которые не являются потокобезопасными, а ваш более поздний пример с вызовом GLOBAL_VAR.sub "почти наверняка" поточно-безопасным. Но... там все еще было чертово отсутствие письменности promises.: -)

Ответ 2

Да, они потокобезопасны. Поскольку между функциями есть только словарь _cache, каждая функция будет использовать его для поиска сгенерированного значения, и если значение не было в _cache, функции будут генерировать значение и помещать его в _cache, и он не будет нарушать безопасность потока