Python 板


LINE

簡單回一下你的誤區。 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),也就是這是多 : 餘的邏輯包裝。最簡單的方式是: : --- mongo.py : from pymongo import MongoClient : instance = None : def create(): : if instance is None: : instance = MongoClient( : 'mongo://127.0.0.1:27017', : maxPoolSize=10 : ) : --- app.py : import mongo : mongo.create() # 之後拿 mongo.instance 來運用 : mongo.create() # 重複呼叫create()會因為instance已經不是None而不會做任何事 : 事實上我想不太到為什麼會導致重複create的狀態,照理說程式應該開頭create : 一次後就只用create好的實體,除非斷線否則再也不會呼叫第二次create才對。你如 : 果把問題一也解決,就會發現連create(或者說整個mongo.py)都是多餘包裝。 : : --- mongo.py : : instance = None : : isInit = False : : def create(): : : mogno = MongoClient('mongo://127.0.0.1:27017', maxPoolSize=10) : : return mogno : : def mongoClient(): : : global isInit, instance : : if isInit == False: : : instance = create() : : isInit = True : : --- app.py : : import mongoClient : : mongoClient() : : mongoClient() : : mongoClient() --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.218.219.240 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1615887411.A.F99.html ※ 編輯: zerof (180.218.219.240 臺灣), 03/16/2021 17:41:04
1F:→ zerof: 用 mobile app 發文排版有點怪就將就點 03/16 17:42
2F:→ zerof: lock 的部份關鍵字找『雙重檢查鎖定模式』自己研究一下8 03/16 17:58
3F:推 ddavid: 我完全同意你說的內容,但就原Po明白擺出的Code而言,端 03/17 05:59
4F:→ ddavid: 出這篇的內容是否有種XY Problem的感覺?XD 03/17 05:59
5F:推 ddavid: 比如原問如果明白講了在multi-threading,我自然就不會這 03/17 06:03
6F:→ ddavid: 麼答了,但他明白就在問app.py直接call了三次XD 03/17 06:03
7F:推 ddavid: 1的部分亦同。當然你的補充都是很正確,我單純在原問有所 03/17 06:09
8F:→ ddavid: 補充設定以前就先這麼答,待他若不滿意而有所補充,自然 03/17 06:09
9F:→ ddavid: 你就華麗登場了XD 03/17 06:09
打字沒辦法表示語氣,有覺得冒犯的話先說個抱歉。 就原文的部份,我的看法是 1F 給的 singleton & after_create hook 這兩個關鍵字 就足以解決他的問題了。(當然他自己寫的 code 的 quality 是另一回事) (以他的檔名`app.py` + db initial 的情況,沒意外會是 flask-like 的 web) 基本上我回文主要是基於你的內文 (會提到 multi-thread 的部份,一來是 link 中 的 `_RunningLoop` 是繼承自 threading.local ,二來是你原文內對 create method 「想不太到會導致重複」的補充說明。) btw, link 稍微更新了一下,之前好像縮的時候沒縮到行號,在 L:694 左右。 當然我也不單純是無聊想糾正你,在假設他是用 flask 的情況下,在 local debug 的 時候就可以用 `app.run(threaded=True)` 來模擬(?) production 的情況,在文件內提 供的多數 deploy options (gevent, twisted, gunicorn...) 內都會有 multithreading 的 context (如果是用 Sanic 的話就更複雜了但我想會 Sanic 的不會問這種問題) 這些內容基本上用他用的 framework 當 keyword 加上 singleton/after_create hook 都會有些類似的 stackoverflow 可以研究參考。 (不過 flask 沒有 after_create hook ,當然你沒說我也沒必要特別提供正確的... 呃不是,就 keyword 自己研究下先搞清楚自己在問什麼說不定就解決了嘛) 我自己的想法很簡單,你懶我也懶,資訊給得少我就回少一點…會在網路上問問題的 人我自己是歸類成兩種,一種會符合 SSCCE(http://www.sscce.org/ ),要回問題就很 快;另一種就是給的通常都是片段的資訊,有時候自己也不知道自己在問什麼 (這種連 吐嘈都覺得好懶啊...)。 除此之外的共通點就是,會再給更多資訊的很少。 (有時候是自己想通了,有時候是 看了別人給的建議反而做了別的選擇之類的 blahblah) 這種行為就像是在丟 UDP 的 packets 一樣,沒有下文。 (反正我問題解了就好,回個感謝或是什麼之類的就再說) 也無所謂啦,反正我也是那種興致來了就回個文, keywords 都有大家自己研究研究 大概是這樣。最後還是回到一開頭那句,看文的覺得有冒犯就抱歉惹誤會誤會>< ※ 編輯: zerof (180.218.219.240 臺灣), 03/18/2021 02:31:29
10F:推 ddavid: 完全沒問題!:) 03/18 08:04
11F:→ ToastBen: 誤區是哪裡的方言? 03/18 18:57
12F:→ zerof: 誤區一詞常見於商院相關書籍,英文應該是用 area of misund 03/19 00:07
13F:→ zerof: erstanding; 台文比較接近的詞應該是 誖誤 (但實際上和誖誤 03/19 00:07
14F:→ zerof: 的意思有些出入) 中文有蠻多詞在萌典/教育部辭典是查不到 03/19 00:07
15F:→ zerof: 的。至於是否為中國慣用詞彙,希望你可以研究一下 我也蠻想 03/19 00:07
16F:→ zerof: 知道的 ;) 03/19 00:07
17F:→ kobe8112: 誖誤不是有些出入,是完全不同吧... 03/19 09:09
18F:→ kobe8112: 就單純積非成是而已 03/19 09:09
19F:→ zerof: 個人建議就還是...查查字典 03/19 20:28







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP