1
wohenyingyu01 2015-06-08 15:19:29 +08:00
下面呢?
|
2
nooper 2015-06-08 15:24:32 +08:00
单例模式在多进程下呢?
|
3
est 2015-06-08 15:32:12 +08:00
m = ModuleSingleton()
这货不就是全局变量? 多进程考虑单例模式,直接反问主考官星际网络30%掉包 1500ms 延迟下集群如何实现单例。 |
4
mengzhuo OP |
5
ibigbug 2015-06-08 16:34:42 +08:00
ModuleSingleton 跟其他两个不一样吧。这个是事先生成好了一个放在那里等人来用。
|
6
binux 2015-06-08 16:44:46 +08:00 1
第一次听说创建个全局变量就叫单例的。
如果这个单例我实际上不用呢?你也要创建吗? |
7
Smartype 2015-06-08 17:19:30 +08:00 via iPhone
1. 这就是 singleton???
2. 这样就快? 哪位给解释下 |
8
mengzhuo OP |
9
hahastudio 2015-06-08 17:36:45 +08:00
全局变量就算单例我也就不提了,用 Module 算是一个讨巧的方法
但是你只能庆幸你的 Python 实现是带 GIL 的,如果是不带 GIL 的= = |
10
dddd 2015-06-08 17:38:54 +08:00 1
这是我们 Java 设计模式课上老师所讲的翻版: http://damnever.github.io/2015/04/07/singleton-pattern-in-python/
|
11
JQ 2015-06-08 17:51:00 +08:00
以前都没有关注到这个
|
12
Smartype 2015-06-08 20:19:28 +08:00
@dddd @hahastudio 对啊,double check才对嘛,我觉得楼主不知道我要说什么,好在python有GIL,也是可以的,哈哈
|
13
ming2281 2015-06-08 20:33:12 +08:00
缓存一个URL在模块级别,题主是这样写的吗?
``` _URL = xxx def get(refresh=False): if refresh: get.reates = {} if get.retes: return get.rates with urllib.request.urlopen(_URL) as f: for line in f: line = line.rstrip().decode('utf-8') if not line or line.startswith(("#", "Date")): continue name, currency,*rest = re.split(r"\s*,\s*, line) key = "{}{})".format(name, currency) try: get.rates[key] = float(rest[-1]) except ValueError as err: print "error:{}: {}".format(err, line) return get.rates get.rates = {} ``` |
14
est 2015-06-09 12:24:30 +08:00
还是ruby简单。直接 ||= 就行了。
|
15
aec4d 2015-08-06 11:04:51 +08:00
题主啊,你应该先别谈效率。。。先写对了再说。。。
你这里至少要加一个@classmethod 这样就是一个正确的单例了。再根据6楼说的在调用的时候在创建。那么可以考虑这样写 class ModuleSingleton(object): @classmethod def get(cls): if not hasattr(cls, '_instance'): cls._instance = 0 cls._instance += 1 return cls._instance a = ModuleSingleton() |