吐槽 Python

2015-11-19 16:01:53 +08:00
 Damnever
我猜你们看到 **吐槽** 两个字就会进来的。。。

撸了个高仿 Ubuntu 不带参数的 ping 程序。这里: https://github.com/Damnever/dping

撸的过程中考虑到一个问题,就是计算丢失率的时候,如果发送了一个报文,发送的报文计数(就叫 transmitted )加一,接受到一个报文,接受到的报文计数(就叫 received )加一。如果发送了一个报文并且 transmitted 加一, 如果此时按下`Ctrl + C`,假设发完这个之后是一定能收到响应报文的,那么 received 就会比理论值少一,丢失率就变大。

当时就想 Python 是否能阻塞 SIGINT ,结果大失所望。。。最后我这种 C 语言学渣还得强行撸点 C 代码,反正是能用。。。 除了运行效率这种人人皆知在脚本语言中不算大槽点的问题, Python 终于让我失望了。。。
3322 次点击
所在节点    Python
33 条回复
jiang42
2015-11-19 16:14:19 +08:00
为什么不把你尝试的方法发出来呢?为什么不谷歌一下呢?其实你让我挺失望的。
clino
2015-11-19 16:16:57 +08:00
看不懂楼主上面关于丢失率的那些描述...
Damnever
2015-11-19 16:17:01 +08:00
@jiang42

。。。不知道你仔细看没

Google 了,要不然我怎么会说我失望。源码就是上面那个链接,把 C 代码发一遍吧 https://github.com/Damnever/dping/blob/master/dping/_sigpending.c
Damnever
2015-11-19 16:20:25 +08:00
@clino

如果发了一个包, transmitted 就加一,你`Ctrl + C`中断程序,你就收不到响应了, 假设这个响应是一定能收到的,不会丢失,但是程序已经挂了,那么 received 就比理论上少一,那么丢失率 (transmitted - received) / transmitted 就比理论上大一点。
9hills
2015-11-19 16:20:45 +08:00
最简单的办法难道不是直接丢弃最后一个报文的计数么。。

你的场景不就是 run 一个 ping ,然后中途 ctrl+c 导致计数有 1 的误差
felixzhu
2015-11-19 16:20:49 +08:00
楼主做这个的目的是什么?系统的 PING 实现也是无视掉了最后一个包啊。

➜ ping www.baidu.com
PING www.a.shifen.com (61.135.169.125): 56 data bytes
^C
--- www.a.shifen.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
9hills
2015-11-19 16:21:27 +08:00
@Damnever 如果不管最后一个报文收到还是没收到都直接丢弃相关的计数呢。
lhbc
2015-11-19 16:23:36 +08:00
把发送数用两个计数器不就行了
send 发出数
transmitted timeout 或 received 后 +1

然后直接计算 received / transmitted
zjq426
2015-11-19 16:27:07 +08:00
python 按下 control+c 不是会抛出一个 KeyboardInterrupt 异常么,如果只是想正常中止可以捕获这个并处理。如果是要处理 signal 貌似也可以通过 signal.signal 库来注册你的 handler.

http://stackoverflow.com/questions/1112343/how-do-i-capture-sigint-in-python
Damnever
2015-11-19 16:28:14 +08:00
@9hills
@felixzhu

好吧,实际上是我又不想把它丢掉,既然发出去了。。。
Damnever
2015-11-19 16:29:44 +08:00
@zjq426 这个我知道,我是要阻塞 SIGINT
zjq426
2015-11-19 16:34:18 +08:00
@Damnever 貌似 python 只能捕获 signal 并忽略,并不能阻塞 signal 。我好像明白你的槽点了。
jiang42
2015-11-19 16:36:59 +08:00
@Damnever 再去看看提问的艺术

我看了 readme ,如果是你 readme 里那种情况的话
https://gist.github.com/anonymous/c92e30504540a28c2788
Damnever
2015-11-19 16:38:28 +08:00
@jiang42 你是忽略掉了 SIGINT 啊,大哥!!!
jiang42
2015-11-19 16:42:26 +08:00
@Damnever 可是这个行为和你 readme 里面的示例是一样的。所以你期望的行为是怎么样的?
mengzhuo
2015-11-19 16:42:33 +08:00
跟语言没干系啊,这都啥奇葩需求
你都终止进程了 还想让死人干什么?
est
2015-11-19 16:42:44 +08:00
Damnever
2015-11-19 16:46:00 +08:00
@mengzhuo 额。。。
Damnever
2015-11-19 16:46:39 +08:00
@est 。。。估计是我的文笔太差了
linescape
2015-11-19 16:48:26 +08:00
@felixzhu 我想知道 手为啥有这么快。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/237352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX