[Python] datetime.strptime() 出現 AttributeError: _strptime

[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)

 

 

 

(本頁面已被瀏覽過 304 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料