我正在开发一个多人游戏,它需要一个消息队列(即消息输入,消息输出,没有重复或删除消息,假设没有意外的高速缓存驱逐).以下是我所知道的基于memcache的队列:
我从这篇博文中了解了memcache队列的概念:
所有消息都以整数作为键保存.有一个密钥具有下一个密钥,另一个密钥具有队列中最旧的消息的密钥.要访问这些,增量/减量方法用作其原子,因此有两个键充当锁.它们会递增,如果返回值为1,则进程具有锁定,否则它将继续递增.一旦完成该过程,它将值设置回0.简单但有效.需要注意的是整数将溢出,因此有一些逻辑可以在我们接近该限制时将使用的密钥设置为1.由于增量操作是原子的,只有在使用两个或更多个内存缓存(用于冗余)时才需要锁定,以保持这些内存同步.
我的问题是,是否有可以在App Engine上运行的基于memcache的消息队列服务?
我正在寻找的是最好的方式,'如果这个列表太短,将它延长到9个元素并添加'选择4','选择5'等作为附加元素.另外,用'Choice x'替换任何'None'元素.也可以替换""和0.
一个示例转换将是
['a','b',None,'c']
Run Code Online (Sandbox Code Playgroud)
至
['a','b','Choice 3','c','Choice 5','Choice 6','Choice 7','Choice 8','Choice 9']
Run Code Online (Sandbox Code Playgroud)
我的初始代码滥用try/except并且有一个我没注意到的一个一个错误; 感谢joeforker和所有指出的人.根据评论,我尝试了两个同样测试良好的简短解决方案:
def extendChoices(cList):
for i in range(0,9):
try:
if cList[i] is None:
cList[i] = "Choice %d"%(i+1)
except IndexError:
cList.append("Choice %d"%(i+1)
Run Code Online (Sandbox Code Playgroud)
和
def extendChoices(cList):
# Fill in any blank entries
for i, v in enumerate(cList):
cList[i] = v or "Choice %s" % (i+1)
# Extend the list to 9 choices
for j in range(len(cList)+1, 10):
cList.append("Choice %s" % (j))
Run Code Online (Sandbox Code Playgroud)
我认为#2赢得更多pythonic,所以它是我将使用的那个.它易于理解和使用常见的结构.拆分步骤是合乎逻辑的,可以使人们更容易理解.
Polymer 1.0最近发布,我可以在elements.polymer-project.org网站下载单点元素,但是我找不到一个简单的链接来下载一个大的zip文件中的所有东西?
知道他们藏在哪里吗?
在这种情况下是否存在任何可能发生的安全漏洞:
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
Run Code Online (Sandbox Code Playgroud)
unsanitized_user_inputstr对象在哪里.字符串是用户生成的,可能很讨厌.假设我们的Web框架没有让我们失望,那么它就是来自Python内置的一个真正的诚实的str实例.
如果这很危险,我们可以对输入做任何事情以使其安全吗?
我们当然不希望执行字符串中包含的任何东西.
也可以看看:
(我相信)对这个问题不重要的更大背景是我们有成千上万的这些:
repr([unsanitized_user_input_1,
unsanitized_user_input_2,
unsanitized_user_input_3,
unsanitized_user_input_4,
...])
Run Code Online (Sandbox Code Playgroud)
在某些情况下嵌套:
repr([[unsanitized_user_input_1,
unsanitized_user_input_2],
[unsanitized_user_input_3,
unsanitized_user_input_4],
...])
Run Code Online (Sandbox Code Playgroud)
它们本身转换为字符串repr(),放入持久存储,最后用eval读回内存.
Eval从持久存储中反序列化字符串比pickle和simplejson快得多.解释器是Python 2.5所以json和ast不可用.不允许使用C模块,不允许使用cPickle.
在vim中搜索我的python完成必杀技时,我真的很喜欢<Cx> <Ci>:"当前和包含文件中的关键字".这几乎总是让我从另一个完成的模块中得到一个令人讨厌的名字,这很棒.
(Omni-completion在它工作时明显更好,但是它经常报告它找不到任何匹配.好吧,Python不是Java,我明白了)
这个多文件完成的唯一问题是它非常慢:在我的上网本上,每次点击<Cx> <Ci>时,具有合理导入集的文件最多需要4或5秒才能解析.每次点击<Cx> <Ci>时,似乎都会加载每个导入的文件.有没有办法缓存文件或加快这个过程?使用标签完成会更快吗?
python ×2
autocomplete ×1
completion ×1
eval ×1
jquery ×1
memcached ×1
polymer ×1
polymer-1.0 ×1
vim ×1