15

我尝试谷歌搜索,但没有得到权威的答案。

有人可以确认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 时,这会按预期工作吗?

4

2 回答 2

4

我不认为有一个权威的答案——除了在源代码中挖掘,它可以为你提供 Python 的现有版本但不一定是未来版本的答案——因为至少某些版本的正则表达式模块的某些部分是用C(至少对于 CPython;例如对于 Jython,谁知道呢?),似乎没有人对它们做出任何承诺。

在实践中,我没有看到任何不是线程安全的 RE 代码,您后面的GLOBAL_VAR.sub调用示例“几乎可以肯定”是线程安全的。但是......仍然缺乏书面承诺。:-)

于 2013-07-12T04:08:04.047 回答
2

是的,它们是线程安全的,因为函数之间只有一个_cache字典,每个函数都会使用它来查找生成的值,如果值不在_cache中,函数会生成值并将其放入_cache字典中,并且不会违反线程安全

于 2013-07-11T10:14:54.647 回答