go语言dropbox go语言适合做什么
我为什么从python转向go
坦白的讲,在一帮python用户面前讲为什么放弃python转而用go其实是一件压力蛮大的事情,语言之争就跟vim和emacs之争一样,是
成都创新互联公司专注于东明网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供东明营销型网站建设,东明网站制作、东明网页设计、东明网站官网定制、成都小程序开发服务,打造东明网络公司原创品牌,更为您提供东明网站排名全网营销落地服务。
一个永恒的无解话题,稍微不注意就可能导致粉丝强烈地反击。所以我只会从我们项目实际情况出发,来讲讲为什么我最终选择了go。
为什么放弃python
首先,我其实得说说为什么我们会选择python。在我加入企业快盘团队之前,整个项目包括更早的金山快盘都是采用python进行开发的。至于为
什么这么选择,当时的架构师葱头告诉我,主要是因为python上手简单,开发迅速。对于团队里面大部分完全没服务端开发经验的同学来说,python真
的是一个很好的选择。
python的简单高效,我是深有体会的。当时私有云项目也就几个程序员,但是我们要服务多家大型企业,进行定制化的开发,多亏了python,我们才能快速出活。后来企业快盘挂掉之后,我们启动轻办公项目,自然也使用python进行了原始版本的构建。
python虽然很强大,但我们在使用的时候也碰到了一些问题,主要由如下几个方面:
动态语言
python是一门动态强类型语言。但是,仍然可能出现int + string这样的运行时错误,因为对于一个变量,在写代码的时候,我们有时候很容易就忘记这个变量到底是啥类型的了。
在python里面,可以允许同名函数的出现,后一个函数会覆盖前一个函数,有一次我们系统一个很严重的错误就是因为这个导致的。
上面说到的这些,静态语言在编译的时候就能帮我们检测出来,而不需要等到运行时出问题才知道。虽然我们有很完善的测试用例,但总有case遗漏的情况。所以每次出现运行时错误,我心里都想着如果能在编译的时候就发现该多好。
性能
其实这个一直是很多人吐槽python的地方,但python有它适合干的事情,硬是要用python进行一些高性能模块的开发,那也有点难为它了。
python的GIL导致无法真正的多线程,大家可能会说我用多进程不就完了。但如果一些计算需要涉及到多进程交互,进程之间的通讯开销也是不得不考虑的。
无状态的分布式处理使用多进程很方便,譬如处理http请求,我们就是在nginx后面挂载了200多个django server来处理http的,但这么多个进程自然导致整体机器负载偏高。
但即使我们使用了多个django进程来处理http请求,对于一些超大量请求,python仍然处理不过来。所以我们使用openresty,将高频次的http请求使用lua来实现。可这样又导致使用两种开发语言,而且一些逻辑还得写两份不同的代码。
同步网络模型
django的网络是同步阻塞的,也就是说,如果我们需要访问外部的一个服务,在等待结果返回这段时间,django不能处理任何其他的逻辑(当然,多线程的除外)。如果访问外部服务需要很长时间,那就意味着我们的整个服务几乎在很长一段时间完全不可用。
为了解决这个问题,我们只能不断的多开django进程,同时需要保证所有服务都能快速的处理响应,但想想这其实是一件很不靠谱的事情。
异步网络模型
tornado的网络模型是异步的,这意味着它不会出现django那样因为外部服务不可用导致这个服务无法响应的问题。话说,比起django,我可是非常喜欢tornado的,小巧简单,以前还写过几篇深入剖析tornado的文章了。
虽然tornado是异步的,但是python的mysql库都不支持异步,这也就意味着如果我们在tornado里面访问数据库,我们仍然可能面临因为数据库问题造成的整个服务不可用。
其实异步模型最大的问题在于代码逻辑的割裂,因为是事件触发的,所以我们都是通过callback进行相关处理,于是代码里面就经常出现干一件事情,传一个callback,然后callback里面又传callback的情况,这样的结果就是整个代码逻辑非常混乱。
python没有原生的协程支持,虽然可以通过gevent,greenlet这种的上patch方式来支持协程,但毕竟更改了python源码。另
外,python的yield也可以进行简单的协程模拟,但毕竟不能跨堆栈,局限性很大,不知道3.x的版本有没有改进。
开发运维部署
当我第一次使用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他整个python目录打包给我用,我才能正常的将项目跑起来。话说,现在有了docker,是多么让人幸福的一件事情。
而部署python服务的时候,我们需要在服务器上面安装一堆的包,光是这一点就让人很麻烦,虽然可以通过puppet,salt这些自动化工具解决部署问题,但相比而言,静态编译语言只用扔一个二进制文件,可就方便太多了。
代码失控
python非常灵活简单,写c几十行代码才能搞定的功能,python一行代码没准就能解决。但是太简单,反而导致很多同学无法对代码进行深层次的思
考,对整个架构进行细致的考量。来了一个需求,啪啪啪,键盘敲完开速实现,结果就是代码越来越混乱,最终导致了整个项目代码失控。
虽然这也有我们自身的原因,譬如没好的代码review机制,没有好的项目规范,但个人感觉,如果一个程序员没经过良好的编码训练,用python很容易就写出烂的代码,因为太自由了。
当然,我这里并不是说用python无法进行大型项目的开发,豆瓣,dropbox都是很好的例子,只是在我们项目中,我们的python代码失控了。
上面提到的都是我们在实际项目中使用python遇到的问题,虽然最终都解决了,但是让我愈发的觉得,随着项目复杂度的增大,流量性能压力的增大,python并不是一个很好的选择。
为什么选择go
说完了python,现在来说说为什么我们选择go。其实除了python,我们也有其他的选择,java,php,lua(openresty),但最终我们选择了go。
虽然java和php都是最好的编程语言(大家都这么争的),但我更倾向一门更简单的语言。而openresty,虽然性能强悍,但lua仍然是动
态语言,也会碰到前面说的动态语言一些问题。最后,前金山许式伟用的go,前快盘架构师葱头也用的go,所以我们很自然地选择了go。
go并不是完美,一堆值得我们吐槽的地方。
error,好吧,如果有语言洁癖的同学可能真的受不了go的语法,尤其是约定的最后一个返回值是error。项目里面经常会充斥这样的代码:
if _, err := w.Write(data1); err != nil {
returun err
}
if _, err := w.Write(data2); err != nil {
returun err
}
难怪有个梗是对于一个需求,java的程序员在写配置的时候,go程序员已经写了大部分代码,但是当java的程序员写完的时候,go程序员还在写err != nil。
这方面,errors-are-values倒是推荐了一个不错的解决方案。
包管理,go的包管理太弱了,只有一个go
get,也就是如果不小心更新了一个外部库,很有可能就导致现有的代码编译不过了。虽然已经有很多开源方案,譬如godep以及现在才出来的gb等,但毕
竟不是官方的。貌似google也是通过vendor机制来管理第三方库的。希望go 1.5或者之后的版本能好好处理下这个问题。
GC,java的GC发展20年了,go才这么点时间,gc铁定不完善。所以我们仍然不能随心所欲的写代码,不然在大请求量下面gc可能会卡顿整个服务。所以有时候,该用对象池,内存池的一定要用,虽然代码丑了点,但好歹性能上去了。
泛型,虽然go有inteface,但泛型的缺失会让我们在实现一个功能的时候写大量的重复代码,譬如int32和int64类型的sort,我们
得为分别写两套代码,好冗余。go 1.4之后有了go
generate的支持,但这种的仍然需要自己根据go的AST库来手动写相关的parser,难度也挺大的。虽然也有很多开源的generate实现,
但毕竟不是官方的。
当然还有很多值得吐槽的地方,就不一一列举了,但是go仍旧有它的优势。
静态语言,强类型。静态编译能帮我们检查出来大量的错误,go的强类型甚至变态到不支持隐式的类型转换。虽然写代码感觉很别扭,但减少了犯错的可能。
gofmt,应该这是我知道的第一个官方提供统一格式化代码工具的语言了。有了gofmt,大家的代码长一个样了,也就没有花括号到底放到结尾还是新开一行这种蛋疼的代码风格讨论了。因为大家的代码风格一样,所以看go的代码很容易。
天生的并行支持,因为goroutine以及channel,用go写分布式应用,写并发程序异常的容易。没有了蛋疼的callback导致的代码逻辑割裂,代码逻辑都是顺序的。
性能,go的性能可能赶不上c,c++以及openresty,但真的也挺强悍的。在我们的项目中,现在单机就部署了一个go的进程,就完全能够胜任以前200个python进程干的事情,而且CPU和MEM占用更低。
运维部署,直接编译成二进制,扔到服务器上面就成,比python需要安装一堆的环境那是简单的太多了。当然,如果有cgo,我们也需要将对应的动态库给扔过去。
开发效率,虽然go是静态语言,但我个人感觉开发效率真的挺高,直觉上面跟python不相上下。对于我个人来说,最好的例子就是我用go快速开
发了非常多的开源组件,譬如ledisdb,go-mysql等,而这些最开始的版本都是在很短的时间里面完成的。对于我们项目来说,我们也是用go在一
个月就重构完成了第一个版本,并发布。
为什么dropbox在中国用不了
目前在国内是无法登录Dropbox,需要借助代理访问。可以选择类似Dropbox的软件
在功能上 和Dropbox比较类似的是坚果云。
同步功能
当你手机拍摄了照片想存到电脑里要怎么做?
传统点就是手机用数据线连接电脑,找到照片复制到电脑。
有点科技感的可能是把手机用微信文件传输助手发到电脑上,电脑上另存为。看上去无线了,但是其中还有点开电脑微信、扫码登录、另存为选择路径等步骤。
体验最好的操作是打开坚果云App,上传照片,手机上传成功的那一刻电脑端弹出提示,IMG.XXX已经同步完成。照片已经在电脑里了。
这就是同步功能,一个设备文件变动,多个设备同步变动。
2.历史版本
对于很多设计师、文案等职业来说,工作文件是不可能一稿过的,领导必然有各种修改意见。
每次辛苦修改完还要另存为重新加上版本号,最后完稿的文件才10MB,背后的历史版本达到几百MB。可就算是完成了,这些历史版本也不敢删,谁知道明天老板想什么?
如果你用坚果云同步这份文件,你的每次保存坚果云都会自动同步,同时,将之前的版本保存在云端,支持下载任一版本和比较版本。历史版本不限制数量,保存一定时间内所有的历史版本。你尽管修改。
3.增量同步
Dropbox Professional版本才有的功能,他们叫智能同步。坚果云无论付费免费,所有用户都可以使用。
增量同步通能就是,假如你Word文件大小为10MB,已同步到坚果云。你打开Word修改了一个字。一般网盘软件因为文件变化了会将这10MB的文件重新完整上传,增量同步则是只上传因为修改这一个字而发生变动的数据,可能也就几KB吧。
现在学什么IT技术最赚钱,能走的更长远?
如果你想进入软件和互联网行业, 恭喜, 这是个好行业, 薪水很高, 也不需靠关系, 一切靠实力说话
目前对吃香的IT 行业top榜给你参考一下:
1、Java开发
随着现代经济和科技的发展,中国Java编程开发语言行业已经步入了一个高速发展的时代。
大家有目共睹了Java编程语言发展的迅猛,每年的Java人才缺口人数都高达百万以上,而且随着行业发展,Java技术服务市场需求空缺会越来越大。精通Java技术,将拥有更多的就业选择。
2、python
python的发展可以用飞速来形容了,目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。
政府报告中多次提及到的人工智能,就是用Python语言编写的。目前,浙江、北京以及另外几个省市已经确定将把Python编程基础纳入信息技术的课程。
python有哪些优势呢?
简单易学、高层语言、免费开源、可移植性强、丰富的库、面向对象、可扩展性、可嵌入型、规范的代码等,这些都是Python的优势所在。
Python是解释语言,程序写起来非常方便,而且开发生态成熟,有很多现有库可以用。
3、大数据
经过六年沉淀,中国的大数据行业也迎来了新的发展期,势头迅猛。几乎所有人的生活和工作都离不开大数据。
4、人工智能
随着5G时代的到来,人工智能正逐步渗透进人们生活的方方面面,人工智能已经成为对人类生活方式产生最大影响的行业,也是各企业争抢的热点。
大方向上来说,目前人工智能已经在各行各业得到了广泛的应用,从硬件到软件,部分成型的产品已经面世;未来还将逐渐渗透到工作、学习和生活中的每一个场景。人工智能将改变商业格局,人工智能专业人员预计将获得 30 万至 50 万美元的薪水。
5、HTML5大前端
游戏化、场景化、跨屏互动HTML5技术满足了广告主对移动营销的大部分需求,从形式到功用、到传播。
6、网络安全
随着信息化的快速发展,网络/信息安全问题更加突出,对网络/信息安全人才建设不断提出新的要求,再加上近几年国家对网络安全问题的重视,网络安全/信息安全专业就业前景非常广阔。
7、Unity游戏开发
作为专业游戏引擎,Unity游戏开发技术在近几年网络游戏大热的环境下,大受欢迎。
8、云计算
目前,云服务器正在全球范围内逐步取代传统服务器,云计算和云服务器的发展也使中国成为全球服务器大国。
9、全链路UI/UE设计
随着人们对互联网产品用户体验度的提升,以及对外观审美的提高,各大企业对UI设计师的需求不断提升。
10、物联网
5G融入智能物联网技术,进入万物互联时代,物联网风暴席卷全球,BAT、谷歌、移动、联通等等世界互联网巨头纷纷抢占这一高地。
11、互联网营销
全民营销时代,营销无处不在,内容营销与事件营销显现出巨大优势,成为任何企业都非常看重的重点。
12、GO语言开发
作为区块链热门编程语言,Go语言目前已成为政策重点扶持对象。京东、小米、美团、滴滴、新浪、网易等等企业应用层出不穷。
说了这么多职业方向, 你会发现, 绝大多数都要求懂一定的技术,对于想学习什么,就要看你自己的兴趣,以及工作城市对于岗位薪资的要求,可以参考这些选择学习的方向。希望我的回答对你有多帮助。
go能开发大数据脚本吗
可以的。Go语言作为一种全新的编程语言,它具有强大的数据处理能力,并支持各种数据库的调用、快速处理和分析大量数据,因此go语言是开发大数据脚本的首选之一。
分享标题:go语言dropbox go语言适合做什么
文章URL:http://azwzsj.com/article/dosjojc.html