小编Eve*_*len的帖子

如何使用Python 3.5样式异步并在Tornado中等待websockets?

考虑这个简短的片段:

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)

python tornado websocket

11
推荐指数
1
解决办法
4014
查看次数

如何在迭代它时从std :: set中删除元素

如何从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--迭代器无效.

这样做的标准方法是什么?

c++ stl coding-style set

10
推荐指数
1
解决办法
1万
查看次数

为什么使用gccgo构建的二进制文件较小(除了其他差异?)

我一直在试验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)

go gccgo

5
推荐指数
2
解决办法
969
查看次数

静态链接有什么用?

(在出现任何误解之前,我不是在谈论图书馆的联系。)

在我的教科书(关于 MIPS 汇编)中,说明了以下内容:

过程/函数框架(又名激活记录)

  • 一些编译器使用它来管理堆栈存储
  • 除了堆栈指针之外,还使用帧指针寄存器 $fp 来跟踪堆栈上与过程/函数调用有关的所有相关信息。

来电方:

  • 调用者将参数压入堆栈(如果不超过 4 个参数,则通过 $a0 - $a3 传递它们)
  • 调用者在堆栈上为返回值保留空间(或者它们通过 $v0 - $v1 返回)
  • 调用者通过 $v0传递静态链接(堆栈上最近出现的下一个词法封闭过程/函数的地址)

(继续关于被叫方等......)

我很难理解 MIPS 中的动态链接(帧指针等),因为我不知道为什么需要它。最终我发现根本不需要它们,它只是在调试时派上用场。

我对这些静态链接的感觉很相似,有人可以向我解释它们的用途吗(最好是一个例子)?

assembly mips

5
推荐指数
1
解决办法
3821
查看次数

标签 统计

assembly ×1

c++ ×1

coding-style ×1

gccgo ×1

go ×1

mips ×1

python ×1

set ×1

stl ×1

tornado ×1

websocket ×1