[Python] datetime.strptime() 出現 AttributeError: _strptime
最近專案的 python 程式莫名其妙的出現了一個 AttributeError,
說沒有 _strptime 這個屬性…
基本上我們也只是呼叫了 datetime.datetime.strptime() 而已,
而且這個問題只出現過一次,是怎麼回事呢?
查了一下,看來是 python 2.6/2.7 裡面的一個 bug,
如果在 multi-thread 程式裡面呼叫 strptime(),就有可能會遇到:
Python Issue7980: time.strptime not thread safe
照著連結裡的範例做了一個小程式:
from datetime import datetime import time import thread def f(): for m in xrange(1, 13): for d in xrange(1,29): datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') for _ in xrange(10): thread.start_new_thread(f, ()) time.sleep(3)
執行之後,確實就可以重現 AttributeError 的問題:
Traceback (most recent call last): File "test.py", line 9, in f datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') AttributeError: _strptime
原因的話可以看上面連結裡的討論,
或是 Python Bug – Attribute Error _strptime 這篇也有在分析,
就是在 multi-thread 程式裡去呼叫 strptime() 時,
底層去 import _strptime 這個動作可能會有 race condition…
簡單的 workaround 就是在 thread 開始之前,先 import _strptime 就行了~
改好成像下面的程式,就沒問題了:
import _strptime from datetime import datetime import time import thread def f(): for m in xrange(1, 13): for d in xrange(1,29): datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') for _ in xrange(10): thread.start_new_thread(f, ()) time.sleep(3)
(本頁面已被瀏覽過 319 次)