Re: [問題] 限制某個function只能被叫到一次

作者: zerof (貓橘毛發呆雕像)   2021-03-16 17:36:49
簡單回一下你的誤區。
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),也就是這是多
: 餘的邏輯包裝。最簡單的方式是:
:
作者: zerof (貓橘毛發呆雕像)   2021-03-16 17:42:00
用 mobile app 發文排版有點怪就將就點lock 的部份關鍵字找『雙重檢查鎖定模式』自己研究一下8
作者: ddavid (謊言接線生)   2021-03-17 05:59:00
我完全同意你說的內容,但就原Po明白擺出的Code而言,端出這篇的內容是否有種XY Problem的感覺?XD比如原問如果明白講了在multi-threading,我自然就不會這麼答了,但他明白就在問app.py直接call了三次XD1的部分亦同。當然你的補充都是很正確,我單純在原問有所補充設定以前就先這麼答,待他若不滿意而有所補充,自然你就華麗登場了XD
作者: ToastBen (吐司邊)   2021-03-18 18:57:00
誤區是哪裡的方言?
作者: zerof (貓橘毛發呆雕像)   2021-03-19 00:07:00
誤區一詞常見於商院相關書籍,英文應該是用 area of misunderstanding; 台文比較接近的詞應該是 誖誤 (但實際上和誖誤的意思有些出入) 中文有蠻多詞在萌典/教育部辭典是查不到的。至於是否為中國慣用詞彙,希望你可以研究一下 我也蠻想知道的 ;)
作者: kobe8112 (小B)   2021-03-19 09:09:00
誖誤不是有些出入,是完全不同吧...就單純積非成是而已
作者: zerof (貓橘毛發呆雕像)   2021-03-19 20:28:00
個人建議就還是...查查字典

Links booklink

Contact Us: admin [ a t ] ucptt.com