写了一个 TCP 文件传输,才发现 reactor 不是那么简单

2016-05-09 20:55:08 +08:00
 linghutf
3705 次点击
所在节点    分享发现
15 条回复
gamexg
2016-05-09 23:45:55 +08:00
>socket 阻塞式读写,应该改成 IO 事件通知方式,有优化空间

这个是什么意思? golang 不是会对外是同步阻塞,内部根据系统内部自动的使用最优的方案吗?
binux
2016-05-09 23:50:17 +08:00
是你自己没想清楚状态转移,已经出错状态转移吧。
bengol
2016-05-10 05:39:03 +08:00
这是你自己的问题
linghutf
2016-05-10 10:03:03 +08:00
@binux
@bengol 确实没想清楚,对 golang 的封装的 TCP 不了解,还是使用普通 socket 的方式去思考的。
mengzhuo
2016-05-10 15:23:03 +08:00
科科,楼主还是好好看书和标准库代码吧
一个 io.Copy 搞定了
tcp 保证数据完整和顺序
go 本身的协程 调度器 保证不阻塞
net 模块保障 zerocopy
linghutf
2016-05-10 15:25:16 +08:00
@mengzhuo go 代码用的就是 io.Copy 啊,虽然 TCP 保证可靠,你能不做检验吗?
linghutf
2016-05-10 15:27:38 +08:00
我发现在这个社区不能分享东西,都是些你自己怎么怎么样,去看书,难道谁天生就会很多? @livid 请求删除这个主题吧
mengzhuo
2016-05-10 15:59:27 +08:00
@linghutf
以太包有校验
tcp 包有校验

go 本身对于底层做得非常精巧,你偏偏要秀 libevent ?为什么这么快?就是因为这两用的都是系统的多路复用,你不知道罢了。
go 的 zero copy 也是依赖系统的 sendfile , sendfile 又是依赖主板上的 dma 。

正因为没人天生会,所以叫你多看书,多学学
这怎么了?玻璃心的话那没治。

下载器有校验是因为文件是多线程分块传输的
scp 不算狠 rsync 都是计算文件块的 sum 值来达到变更数据更新的

当然,欢迎 pr 、建议、指正
linghutf
2016-05-10 17:26:48 +08:00
@mengzhuo 就知道回复就会有人说玻璃心,呵呵,删帖吧
wadahana
2016-05-10 17:34:38 +08:00
觉得 lz 的需求可以 写个脚本跑 netcat 实现。。
linghutf
2016-05-10 17:39:17 +08:00
实际项目中不校验?那直接 conn.Read()得到文件名,如果有 io.Copy ,对方 conn.Write()之后 io.Copy 不就完成一个 TCP 文件传输。
但我只是学习使用这些工具,序列化,数据校验, reactor 模式,异步 IO 不行吗?
我知道什么事情都想怎么简单怎么来,但是我作为一个初级的开发者,还是一个在校的学生,这样简单做能找到工作吗?
这就叫社区充满一股戾气,自以为看问题很犀利,却总是忽视别人的需求。
fcicq
2016-05-10 21:37:43 +08:00
@linghutf 大致总结起来就是你需要遵守术业有专攻的规则.
首先没有人期望你的实现能够服务于多少人. 即便如此, 方案的成熟程度也和期望使用频率大致成正比.
如上所说 golang 有 io.Copy, nodejs stream 的 pipe() 方法都是异常方便的. 这是语言和库提供的福利, 不需要自己去考虑 sendfile 或者 splice 等等的问题.
一个透过现代 TLS 加密和 POST 上传请求可以解决的问题, 不需要楼主增添无谓的序列化和校验复杂度, 其中还暴露了楼主没有密码学基础的事实. 只有楼主一个用户的情况下快和不快重要吗? 不同的框架支持不同的异步模式, 使用了某语言就需要接受语言的思维, 并固定的使用这种语言所提供的工具组合, 框架大致也是同理.
mengzhuo
2016-05-11 09:07:37 +08:00
@linghutf 直说你要用尽量多的技术来找工作不就好了。照你这样直接被刷的。做技术最怕就是一知半解装逼说名词,就算混进去了,迟早要露馅的。

戾气?你只看我说的玻璃心三个字,读了上下文了么?
我跟你解释了原理、源码结构、更好的参考还叫戾气?
知道 rtfm 么?那才叫戾气。
mengzhuo
2016-05-11 09:10:57 +08:00
最后再扯一句,用的东西简单,不代表你不用学里面的内部实现
大巧不工、重剑无锋
工作之后你就明白了
firefox12
2016-05-12 16:07:17 +08:00
阻塞写法 没什么性能差的,绝对的速度影响在磁盘 io 上面。你的网络速度是完全可以超过磁盘速度的。

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

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

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

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

© 2021 V2EX