最近写了一个多线程写数据的脚本,其中使用datetime.strptime
的时候,报了一个AttributeError: _strptime_time
的错误。
对于这个错误,本地无论如何都不能重现,百思不得其解。经过小容容的指点,发现了原来datetime.strptime
线程不安全,文章在此
这个错误很容易复现,多线程中只调用datetime.strptime
,错误是必现的。代码如下(原谅我懒,直接借用了别人的代码)
1 | import time |
datetime.strptime
是基于time.strptime
的,代码中就都使用time.strptime
来代替。解决的办法也很简单,在线程外先使用一次datetime.strptime
,或者import _strptime
1 | import time |
代码跟过去,发现_strptime
这个module里,有几个可疑的地方。一是定义了几个全局变量,第一个是线程锁,一个是正则的缓存
1 | _cache_lock = _thread_allocate_lock() |
而_strptime
函数内部,首先就用到了这两个变量
1 | global _TimeRE_cache, _regex_cache |
我怀疑是多线程使用_strptime
的时候,初始化撞在了一起,产生了两个线程锁,而后面的操作,又是线程不安全的。这次就不讨论了。
让我大跌眼镜的是,__builtin__
的一个使用很普遍的function,竟然是线程不安全的。