2017-03-01 139 views
1

首先,我甚至沒有發現內存錯誤/ segfault在python中是可能的。榮譽學習新的東西!Python分割錯誤?

我有這個數據庫,我創建

database = DBManager(dbEndpoint,dbUser,dbPass,dbSchema) 

然後我嘗試在一個線程中使用它

def stateTimeThreadStart(): 
    database.getTable('CLIENTS') 

threads = [] 
threads.append(threading.Thread(name='State Updater', target=stateTimeThreadStart, args=())) 
threads[0].start() 

輸出是

Segmentation fault: 11 

這到底是怎麼回事這裏?它肯定與database.getTable('CLIENTS')有關,因爲當我發表評論時,問題不會發生。另外,我還試圖將數據庫傳遞給線程,但沒有運氣。有任何想法嗎?

謝謝!

+2

很可能數據庫的東西不喜歡在沒有創建的線程中運行。這是我的第一個猜測。而且,是的,segfaults是可能的,它只是C下的封面。 – paxdiablo

+0

您的CLIENTS表佔用了多少空間?也許這就是你的問題,因爲你可能會獲取一張比你的設備的內存消耗更多內存的表。 –

+0

@paxdiablo我會盡力謝謝!在Gugas它的約300行:) – k9b

回答

2

由於數據庫連接器的原因,可能會發生Python中的分段錯誤。用於連接數據庫的驅動程序通常以C編碼進行編碼,所以如果出現RAM過載或其他原因,則會引發分段故障。

這是因爲您正在使用多線程的事實進一步加劇。如果不仔細處理多線程,大多數數據庫驅動程序都會拋出分段錯誤。大多數數據庫驅動程序協議不能同時使用同一個連接處理多個線程。

經驗法則是不共享線程之間的單個連接。

+2

我想補充一點,爲了確保數據庫連接的創建WITHIN線程本身很重要:) – k9b