解決方法 Pymongo insert 卡住

2021-10-12 12:41:22 字數 1843 閱讀 5082

先說一下標題,當我不知道問題的具體原因的時候,上面的標題就是我在搜尋引擎中輸入的內容。同樣的,我還嘗試過以下幾種搜尋組合:

pymongo insert hangs

pymongo insert stop

pymongo insert no return

mongodb insert hangs

mongodb insert stop

mongodb insert no return

所說的卡住了,就是說,沒有返回值,沒有異常,沒有報錯,就是程式走到那裡就不繼續向下執行了。

以下是**的基本結構:

clt = mongoclient(

"mongodb:"

) db = clt[

'test_bottle'

] col = dest_db[

'test_result'

]

idx =

0 rs =

for r in records:

idx +=

1if idx %

100==0:

col.insert_many(rs)

rs =

可以看到,很簡單,很基礎的**,就是迴圈插入。問題的現象就是,**執行到col.insert_many(rs)的時候,偶爾會出現程式卡住的情況。

這個卡住是隨機的,有時候執行幾次就卡住,有時候資料跑完一圈(幾百萬條資料)也沒卡住。

奇怪吧。

這個問題比較詭異的就是,為什麼會卡住,如果有問題,你報錯就可以了,我捕獲異常,然後特殊處理就可以,但是為什麼會卡住。

行了,直接說問題原因吧:

沒有設定超時時間。

可能有的人會很奇怪,這個東西跟超時時間有什麼關係?

我們來看一下 mongodb 的官方文件:

可以看到,關於超時時間的設定一共有兩個,分別是connecttimeoutmssockettimeoutms,有點類似之前說過的requests模組的connect timeoutread timeout,即:連線超時時間讀取超時時間

這裡比較坑的問題就出現了,這兩個配置的預設值是不超時(never to timeout)

所以,當我們沒有執行這兩個配置的時候,程式就會一直等待連線或者等待讀取資料,也就是咱們上面所說的「卡住」。

既然知道了問題原因,那解決思路就清晰了,設定一下超時時間即可。

設定的方式也有很多種,比如我這裡就是直接修改了 mongodb 的連線 uri:

也就是把上面的

clt = mongoclient(

"mongodb:"

)

修改為

clt = mongoclient(

"mongodb:/?sockettimeoutms=3000&connecttimeoutms=3000"

)

我這裡設定的超時時間都是3000(3s),大家可以根據自身情況自行設定。

當然,如果這樣設定完了之後,記得捕獲異常,然後做特殊處理。

補充知識點:

卡住的「卡」音qiǎ,不是

亂碼解決方法

jsp頁面顯示亂碼 pageencoding utf 8 servlet頁面顯示亂碼 在response輸出內容之前,執行response.setcontenttype text html charset utf 8 post表單傳遞引數亂碼 通過jsp頁面 html頁面或者servlet中的表單元...

usr bin ld lc解決方法

背景 使用海思交叉編譯器編譯庫檔案中出現。原因 ld表示連線,lc表示需要連線libc.a。出現這個,說明缺少需要的libc.a檔案。解決過程 剛開始以為是海思交叉編譯器的問題,便在安裝目錄find libc.a,找到很多個,排除這個原因 然後檢查路徑問題,發現路徑也沒問題。回想一下,虛擬機器是mi...

死鎖解決方法

死鎖是程序併發執行過程中可能出現的現象,哲學家就餐問題是描述死鎖的經典例子。為了防止死鎖,可以採用資源預分配法或者資源按序分配法。資源預分配法是指程序在執行前一次性地向系統申請它所需要的全部資源,如果系統當前不能夠滿足程序的全部資源請求,則不分配資源,此程序暫不投入執行,如果系統當前能夠滿足程序的全...