簡單回一下你的誤區。
1.) 的部分請見 https://git.io/JmZ9b
早一點的版本 (<3.6) 是直接用 None 來作 singleton, 在 Python 用 module scope 的
variables 做這種事還蠻常見的。
2.) 的部分
assign 之前要先用 global keyword 宣告成 global
在 multi-threading 的情況下,第 n 個 thread 有極大的可能在 assignment 完成之
前就進到 if condition, 也就是說client 的 creation 會被執行不只一次以上。
這情況蠻常見的,畢竟多數和 db 相關的 libs 都有直接或間接用到 C 會 release GIL
。
解法可參考上面 asyncio 作 thread-local 的方式,如果是想要 thread-global 的話一
般應該是用 multi-lock
(一時間想不到哪個 source code 裡面有範例可以看,建議自己試一下)
※ 引述《ddavid (謊言接線生)》之銘言:
: ※ 引述《MaR1nlolz (mumimumi)》之銘言:
: : 最近遇到個問題,請問一下各位,
: : 當執行python app.py時,不論MongoClient()被呼叫幾次,我希望create()只被呼叫
一
: : ,
: : 我目前的做法是透過global variable來判斷
: : create()是否被呼叫過,不過global variable用法幾乎都不太建議使用,
: : 避免被其他地方改到,想請問各位有沒有比較好的做法,以下是我的程式碼,謝謝
: 我覺得根本問題是你的使用方式出了問題:
: 1. instance本質上也不應該global使用
: 2. 你這段Code裡面有過多不必要的包裝
: 先跳過問題1。針對問題2,你會發現這裡的isInit == False幾乎等價於
: instance is None(除非很例外的情況導致MongoClient傳回None),也就是這是多
: 餘的邏輯包裝。最簡單的方式是:
: