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