我尝试使用谷歌搜索,但没有得到权威的答案。
有人可以确认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)
当多个线程同时调用clean时,这是否会按预期工作?
答案 0 :(得分:3)
我不认为 是一个权威的答案 - 除了在源代码中进行挖掘,它可以为现有版本的Python提供答案,但不一定是未来的版本 - 因为至少在某些部分正则表达式模块的某些版本是用C语言编写的(至少对于CPython;对于Jython,例如,谁知道?),似乎没有人对它们作出任何承诺。
在实践中,我还没有看到任何不线程安全的RE代码位,而后面的GLOBAL_VAR.sub
调用示例“几乎可以肯定”是线程安全的。但是......仍然缺乏书面承诺。 : - )
答案 1 :(得分:1)
是的,它们是线程安全的,因为函数之间只有一个_cache字典,每个函数都会使用它来查找生成的值,如果该值不在_cache中,函数将生成值并将其放入_cache字典,它不会违反线程安全