考虑这个简短的片段:
import tornado
import tornado.websocket
import tornado.ioloop
import tornado.gen
import tornado.web
class NewWsHandler(tornado.websocket.WebSocketHandler):
async def on_message(self, message):
await self.write_message("echo " + message)
class OldWsHandler(tornado.websocket.WebSocketHandler):
@tornado.gen.coroutine
def on_message(self, message):
yield self.write_message("echo " + message)
app = tornado.web.Application([(r'/', OldWsHandler)])
app.listen(8080)
tornado.ioloop.IOLoop.current().start()
Run Code Online (Sandbox Code Playgroud)
OldWsHandler在Tornado中使用3.5之前的异步函数方式,它工作正常.但是,正如文档所述,最好使用PEP 0492来提高可读性和速度.
文件说:
只需使用装饰器
async def foo()代替函数定义@gen.coroutine,而await不是代替yield.
所以我写了NewWsHandler.但是,在发送websocket消息时,它会发出警告:
/usr/lib/python3.5/site-packages/tornado/websocket.py:417: RuntimeWarning: coroutine 'on_message' was never awaited callback(*args, **kwargs)
我真的不知道如何(正确)修复它.我尝试过装饰它tornado.web.asynchronous,但这假设是一个HTTP动词方法.所以在我覆盖之后finish()(不允许websockets这样做),它似乎有点工作:
class NewWsHandler(tornado.websocket.WebSocketHandler):
def …Run Code Online (Sandbox Code Playgroud) 如何从std::set迭代中删除元素
我的第一次尝试看起来像:
set<T> s;
for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
//Do some stuff
if(/*some condition*/)
s.erase(iter--);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我们想要从集合中删除第一个元素,那么这是有问题的,因为iter--迭代器无效.
这样做的标准方法是什么?
我一直在试验gc和gccgo,我遇到了一些奇怪的行为.
使用我曾编写的程序来测试一些定理,我得到了这些结果:(我删除了不必要的信息以获得可读性)
$ time go build -compiler gc -o checkprog_gc checkprog.go (x 3)
go build <...> 0.13s user 0.02s system 100% cpu 0.149 total
go build <...> 0.13s user 0.01s system 99% cpu 0.148 total
go build <...> 0.14s user 0.03s system 100% cpu 0.162 total
--> average: 0.13s user 0.02s system 100% cpu 0.153 total
$ time go build -compiler gccgo -o checkprog_gccgo checkprog.go (x 3)
go build <...> 0.10s user 0.03s system 96% cpu 0.135 total …Run Code Online (Sandbox Code Playgroud) (在出现任何误解之前,我不是在谈论图书馆的联系。)
在我的教科书(关于 MIPS 汇编)中,说明了以下内容:
过程/函数框架(又名激活记录)
- 一些编译器使用它来管理堆栈存储
- 除了堆栈指针之外,还使用帧指针寄存器 $fp 来跟踪堆栈上与过程/函数调用有关的所有相关信息。
来电方:
- 调用者将参数压入堆栈(如果不超过 4 个参数,则通过 $a0 - $a3 传递它们)
- 调用者在堆栈上为返回值保留空间(或者它们通过 $v0 - $v1 返回)
- 调用者通过 $v0传递静态链接(堆栈上最近出现的下一个词法封闭过程/函数的地址)
(继续关于被叫方等......)
我很难理解 MIPS 中的动态链接(帧指针等),因为我不知道为什么需要它。最终我发现根本不需要它们,它只是在调试时派上用场。
我对这些静态链接的感觉很相似,有人可以向我解释它们的用途吗(最好是一个例子)?