mac搭建go环境报错: go command not found
https://studygolangcom/dl
注意:以下GOPAT自己新建一个目录,不要放在go的安装目录下,会报错
sudo vi ~/bash_profile
export GOPATH=/Users/GoWorkEnv
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
source ~/bash_profile
go env
正常如下:
配置软连接
sudo ln -fs /usr/local/go/bin/go /usr/local/bin/go
ln -fs 强力创建符号连接(symlinks)
符号连接类似windows 的快捷方式
用标准库写出来的就是最好性能了,基础的工作runtime和库都做了,拿来就能写应用,基础设施不用操心。如果你发现标准库或者runtime做得不够好,你有性能更高的做法,那可以提patch,整个社区都受益。
golang是一编译型的强类型语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角。良好的避免了程序员因为“ { 需不需要独占一行 ”这种革命问题打架,也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人。
它有自己的包管理机制,工具链成熟,从开发、调试到发布都很简单方便;
有反向接口、defer、coroutine等大量的syntactic sugar;
编译速度快,因为是强类型语言又有gc,只要通过编译,非业务毛病就很少了。感兴趣的话点击此处,了解一下
架设FTP,方法是FTP架设
SERV-U30
主要新功能:
以 WindowsNT/2000/XP 的 Service 形式运行, 可以随开机而启动服务
把服务器和管理工具分离, 而管理工具可以远程配置 Serv-U 3 的服务器
虚拟路径映射 (Virtual path mappings), 可以很方便地把不同分区, 甚至不同机器上的路径都映射到你想它出现的位置, 对于登录用户来说, 他根本看不出虚拟映射和实际有什么分别
似乎对 DoS (Deny Of Service) 攻击有点对策, 实际应用情况不清楚
Step #1 安装
点击安装程序, 直点 Next 就完成了 没什么好说的
Step #2 第一次运行安装完成后, 服务器的Service会启动, 管理工具会自动运行, 你看到的, 是要你配置好它的 Setup Wizard 唔 基本上 Next 下去就是了, 下面几个可能你会有兴趣:
Domain name: 域的名字
Allow anonymous access: 要让匿名登录吗 (选 No 可以跳过这部分)
Annoymous home directory: 匿名登录后, 用户会看到的目录
Lock annoymous users into their home directory: 选Yes, 不要让他们乱跑
Create named account: 要建立有非匿名用户吗
输入用户名, 密码
(大约和上面过程一样)
Account admin priviledge: 这个用户有远程管理 Serv-U 3 的权限吗
呵呵 通常选 No priviledge 吧
嘿! 基本上搞好了!
Step #3 认识 Serv-U 3 管理工具的的界面
左边的树状结构是 Serv-U 3 的结构层次:
1 Serv-U Server 下面是管理工具在管理的 FTP,
其中<>就是你机上那个服务器了
2 在每个服务器中
License: 给你填注册码
Settings: 服务器总配置
Activity: 给你监测本服务器的运作情况
Domains: 下面的各个 Domain, 是以你的机器拥有的不同IP开的服务器,
按刚才"第一次运行"来做, 你现在会有一个 Domain 了
Step #4: 整体配置
在<>的Settings:
General: 总体限制, 参数设置
Max Speed- 总体限速,
不设的话, 极速可达约 1MBytes/S
Max no of users - 同时的连接数目
不要太多, 很伤硬盘的, 建议不超过20
Check Anonymous password - 匿名登陆密码检查,
不要选, 否则 IE 不能进入
Block Anti Time-out schemes
Block "FTP_bounce"
主要是把些无聊人赶掉, 都选吧, 细节看 Help
Block users who connect
随意, 用于"罚"一下用多线程下载的用户
其馀选项看 Help 吧
Dir Cache: 目录缓存
用户较多时, 可以明显加快用户浏览的速度,
把它打开, 用默认的 MaxSize 25, Time-out 600 sec 差不多了
Auto-Refresh 选取后你会看到在缓存中有哪些目录
Advanced:
Server:
Enable security - 安全设置生效
一定要选上! 否则你会死得很难看 KAKAKA
Sockets:
Inline out-of-band data
选取后听说可以防止 DoS 攻击, 但默认没选, 你自己决定吧
如何配置用户:
Step #1: 域 (Domain) 配置
在 Domains 下选取你的域吧!
Name: 域的名字
Domain IP address: 为简单起见, "Use any available IP address" 算了吧
Domain type:
Store in INI file 比较好,
它把你的服务器的设置都放到 ServUDaemonini ,
重装系统后把这文件放上去就行了
FTP port number:
通常是 21
Settings:
General:
Max no of users - 同时的连接数目
和上一个差不多, 不过是在域里限制
Virtual path mapping - 请看 VPM 篇
Links - 同上
Messages:
很好玩的, 可以把别人登录看到的信息都改掉
Logging:
就是 log 啊 不懂 看 help!
Step #2: 用户帐号
在 Domains 下
Users 右击出现新增/移除用户选单
点选任一用户后, 各项用户参数意义:
Account:
Disable account: 暂时令它失效
Automatically remove account on date: 到了某日期就删掉该用户! (爽!)
User name: 不用多说吧
Password: 留空不填代表不用密码
Home directory: 这用户登录时看到的第 1 个目录
Lock user in home directory:
最如想在用这帐号登陆后, 看到的根目录是所设的 Home Directory,
就选吧 (建议选取, 否则地址会比较难看)
Priviledge: 这用户远程管理 Serv-U 服务器的权限, 具体看 HELP
General:
Allow only N login(s) from same IP address
限制同一 IP 用这帐号的连接数, 选了它吧!
如果考虑到用 IE 的用户, 最好设两个连接,
否则对方可能不能下载, 如果狠心点, 设 1 个也没关系!
Max upload Speed
用这帐号, 每一个连接上传文件的极速
Max download Speed
用这帐号, 每一个连接下载的极速
Idle time-out
发呆多久才 kick 他出去, 个人认为 5 分钟都够了
Sesson time-out
无论他有没有发呆, 上来一段时间后就把他 KICK 走, 即使他在下载
什么东东也照踢不误, 并且在 1 分钟内不让他再上来 这样在很忙下载
站点中可能有用, 可以让多点人有机会访问, 不过确是有点讨厌 呵呵
Max no of users
这帐号同时允许的总连接数目
其馀的比较少用, 看 HELP 吧
Dir Access:
这里设置这用户对你硬盘中, 实际路径的读写权限, 关键哦!
无论是 HOME 目录好, 映射目录也罢 要让用户用得到, 也要在这里加
具体意义在界面上也很明确吧 不多说了, 但别忘了
(记得把 HOME 目录在这里加多一次, files-[read], directories-
这样人家看能看到, 下载到你的东东)
Step #3: 群组帐号
在 Domains 下
Groups 右击出现新增/移除用户选单
看上去很简单是不是 对了 把一个 Group 设置了一点参数,
在任一用户 - Account - Group(s) 中把他加进去, 他就拥有那个参数的权限
有什么用 你自己想想吧
哈哈 基本上我们都搞好了, 但是重头戏 Virtual path mappings 还没出场,
Virtal path mappings:
究竟是什么原因呢 这是因为很多老鸟都对上面几篇一屑不顾, 但却往往
死在 VPM 手上, 但是死在 VPM 的石榴裙下也甘心了 呵呵
在 Domains 下
Settings:
General:
Virtual path mappings:
Step #1: 虚拟路径映射的概念:
1 Physical path: 目录的实际路径
可以是任何Windows分区上任何东东, 甚至网络邻居里的也可以
2 Mapped to: 映射到 (这个目录必须实际存在)
你想把它"变到"你硬盘里的那个目录呢
你可以用到两个变量:
%HOME% : 即"Home directory"
%USER% : 用户名
3 mapped path name:
这个虚拟目录在显示出来的名字
4 记得要在各用户的 Dir access 中设置它对实际路径的权限哦!!!!
Step #2: 举例:
1 你想把 f:movie 映射到匿名登录后看到的 MyMovie 目录:
Physical path: f:movie
Mapped to: %HOME%
mapped path name: MyMovie
在 anonymous 帐号对 f:movie 设 file - read, dir - list 权限
2 你想把 g:mp3 映射到 alex 登录后看到的 AudioMySongs 目录:
Physical path: g:mp3
Mapped to: %HOME%Audio
mapped path name: MySongs
在 alex 帐号对 g:mp3 设 file - read, dir - list 权限
如何封用户:
Step #1 按 IP 封
在 Serv-U 中, IP Access 很多地方都有出现, 这就是限制 IP 访问的地方了
Domain- Settings 里有; 各用户- Settings 里有; 各群组- Settings 里也有
IP access:
如果要限制 IP, 就在这里设置 限制是由上到下执行检查的
这里给出一些例子: (!注意次序!)
1 只对某几个 IP 开放帐号:
----------------
A: 202382418
A: 202382492
A: 202382483
D:
----------------
意思是, 对 202382418 , 202382492 , 202382483
开放, 其馀都不准进入
2 只对一个网段开放:
----------------
A: 20238241
D:
-----------------
意思是, 只对 20238241 开放, 其馀拒绝
3 只拒绝部分IP
--------------
D: 123166
D: 2023823456
A:
--------------
拒绝 123166 的B类网段, 及 2023823456 访问,
其馀都欢迎
看了三个例子, 大家都志该知道 IP 限制如何设置吧,
要注意的一点是, 最后一个限制项目, 最好要设成
A: (其馀都允许进入) 或
D: (其馀都不准进入)
否则, 可能会得不到预期中的限制的效果
Step #2 看不爽封
如果有个人连了上来, 你看他不爽想封掉他
在 <> - Activity 或
你的Domain - Activity 会看到他,
右击, KILL USER
他在你FTP的命运就在你手中了
The End
后记: 好累啊~~~
对IP Access的补充。。。
Step ## "-"连字符的用法(昨晚试了偶半小时。。:< )
补充:
用来简洁地表示不属于整段类地址的一段IP
它可以任意在A、B、C、D类地址中使用
这可是个很好用的地方
比如我只对教育网地址202112-202120开放anonymous帐号
在warftpd/g6中 br>你就要老老实实地在user->anonymous->ip access "allow"项中逐步加上
202112()
202113()
r>202120()
而在ServU30中
你可以直接写成:
202112-120
就这么简单!
#######################################################
关于Message的一些动态的参数:
%Time - 目前的时间
%Date - 目前的日期
%UNow - 目前的联机人数
%UAll - 从激活到目前为止的联机人次
%U24h - 在过去 24 小时内的联机人次
%MaxUsers - 总联机人数上限
%MaxAnonymous - 匿名联机人数上限 (Anonymous FTP)
%Name - 帐号名称
%IP - 对方主机名称/地址 (Hostname/IP)
%DIR - 目前的目录
%Disk - 目前的磁盘驱动器名 ( C: D: E: )
%DFree - 磁盘剩余空间
%Fup - 上传档案个数
%Fdown - 下传档案个数
%Ftot - 总传档数
%Bup - 上传位数
%Bdown - 下传位数
%Btot - 总传输位数
%Tconm - 联机时间数 (以分为单位)
%Tcons - 联机时间数 (以秒为单位, 与 %tconm 配合使用)
例:
◎ 来自 %IP 的女神迷您好。
◎ 女神事务所自 Yggdrasil 系统激活以来已接通 %UAll 位使用者。
◎ 过去 24 小时总共有 %U24h 次联机。
◎ 目前有 %UNow 位使用者在线上,最多容许 %MaxAnonymous 位使用者同时联机机
连上去看到的则是
220-Serv-U FTP-Server v21 for WinSock ready
220-◎ 来自 1401121832 的女神迷您好。
220-◎ 女神事务所自 Yggdrasil 系统激活以来已接通 55 位使用者。
220-◎ 过去 24 小时总共有 55 次联机。
220-◎ 目前有 2 位使用者在线上,最多容许 50 位使用者同时联机。
好玩吧^_^ 这些参数也可以用在 Message File!
关于Dns2go的使用:
DNS2GO——用你自己的名字上网
引言
拨号上网的网民都知道,每次上网用的IP地址都是由ISP动态分配的,因此每次都不同。这样做当然有利于ISP充分利用手中有限的IP地址资源,但却给用户带来了一些不便,因为这就像一个人每天都必须换一个电话号码,让想找他的人无所适从。况且在有一些场合下都需要知道并且告诉别人你的IP地址,比如说你想与朋友做一个点对点的连接进行聊天、传送文件或者玩Internet游戏等等。
再比如,你的公司出于成本和安全性考虑,决定建立本地的Web、FTP、E-mail服务器,目的就是每天定时上网,供出差的同事在外地浏览本公司主页、下载文件以及发回邮件。目前我们对上述问题的解决办法通常是:运行Winipcfg查出自己当前的IP,然后用另一部电话告诉朋友。这时你应该看出拥有固定IP有多方便了吧。也许有人注意到,在我们上网的过程中,在需要输入访问地址的时侯,基本上都是用一个域名代替其IP地址,比如在浏览器中输入http://wwwsinacom”,而不是用它的IP地址。其实,这是利用了Internet上的DNS服务,也就是通过DNS服务器将你输入的域名转换为对应的IP地址。然而,要拥有自己的域名或者固定IP,要么你就去托管(或租用)服务器空间,要么就通过专线直接连至Internet,显然这对一般用户和中小公司而言,是难以承担也是没必要的。 那么怎样才能解决这个矛盾呢?答案就是动态域名解析——DDNS。DNS2GO就是能实现DDNS的软件之一,而且是最好用、功能最全的。[/url]
DNS2GO简介
DNS2GO是Deerfieldcom公司继Wingate 40之后推出的新产品。DDNS的实现要依靠两个程序的协同工作,其一是服务端程序DNS2GO Server,该程序安装在Deerfield的主机Discoverydns2gocom上,最终的域名解析工作由它来完成;其二是客户端程序DNS2GO Client,它安装在拨号上网用户的计算机上。它的作用在于:一旦用户上网,它就取得当前的IP并传送给服务器。这样一来,只需从Deerfield申请一个域名,然后将申请到的域名告诉你的朋友。以后只要你一上网,你的朋友就可以通过这个域名找到你了。
申请域名
域名可以到DNS2GO主http://wwwdns2gocom去申请。申请过程中要输入自己的名字、Email,然后在十几个免费域名中选择一个自己中意的,大致的样式是DNS2GOCOM。之后在“”的位置给自己的计算机起个Internet上的名字,比如:Myweb、Myftp,或者用你自己的名字也行。这样,只要你在网上,你的朋友就可以通过DNS2GOCOM的域名找到你了。[/url]
域名申请好后,接着你要填写关于你申请的域名的相关信息(Profile),包括站点简介、说明、分类,是否将自己的域名显示在DNS2GO社区里,你的计算机上安装了何种服务器软件以及申请哪种增值服务等。最后,你会收到一封E-mail,里面有一个注册码,就是注册DNS2GO时输入的那个,这时就可以下载客户端程序DNS2GOEXE了。
关于增值服务(valuesss Added Services)
上文提到的增值服务是Deerfield为本地计算机安装有E-mail服务器的用户而开设的。具体有如下几项:
1No Email Routing
此项为用户在申请域名时的默认设置。该项服务为免费,但用户计算机不在线时就无法收到其他人发来的邮件。
2POP Forward
POP转发,即用户可以指定一个24小时在线的POP服务器,这样当用户计算机不在线时,Deerfield自动将发给该用户的邮件转发到指定的POP服务器上。
3SMTP Routing
SMTP路由发信,即当用户不在线时,Deerfield先将发给该用户的邮件暂存在自己的服务器上,一旦该用户上网并收到来自DNS2GO客户程序的传送请求,就将存储的邮件直接发给该用户计算机上的邮件服务器。
4POP Routing
POP路由收信,即当用户不在线时,Deerfield先将发给该用户的邮件存储在自己的服务器上,然后该用户可以随时上网并通过本地Email服务器或Email客户程序(如:outlook express)收回邮件。
以上的2-4项服务因为都要占用Deerfield的服务器空间,所以均要收费,但可以有一个30天的试用期。收费标准大约是$70/6MB/年。
使 用 手 册
1安装
首先拨号上网,然后运行下载的安装程序。在图-1中选择要安装的组件,其中DNS2GO Client是必选项。如果用户通过局域网代理服务器上网,则可以在代理服务器上安装下一个组件“DNS2GO网关扩展程序”。注意:这里所说的代理服务器仅指通过TCP Mapping方式进行代理的代理服务软件,如WinGate 20,不包括NAT型的代理服务软件(如SYGate)或LSP型的(如使用WGIC的WinGate30/40)。
在图-2中指定用户计算机上网的方式:“Direct…”为直接方式(通过SYGate、WGIC上网也在此类);“…proxy…”为使用TCP Mapping方式。
2注册
安装完毕后直接进入DNS2GO主界面中的注册页,如图-3。在Domain Name栏中输入申请好的域名,Registration Key栏输入注册码,之后点击“OK”。这时DNS2GO客户开始与远程服务端程序通信,稍后主界面将自动缩小为任务栏上的“升空火箭”图标,表示注册成功,用户就可以使用申请的域名了。如果你在本地计算机上装了Web服务器,这时可以打开浏览器并输入你申请的域名。怎么样,看见你的主页了吧? 3程序界面
状态页(Status)
DNS2GO Service Connection:当前与DNS2GO服务器的连接状态或上一次发生的错误。
Connect/Disconnect:手动连接到DNS2GO服务器或断开连接。
Internet Connection:当前与Internet的连接状态。
Details:
①Domain Name:用户申请好的域名。
②Domain Status:DNS2GO服务器如何处理指向用户域名的访问请求。在“连接”页中指定。
③Heartbeats:DNS2GO客户程序发送给DNS2GO服务器的信息包数目。DNS2GO客户程序每隔一段时间就发送一个heartbeat(心跳)信息包给DNS2GO服务器,通知服务器以下信息:用户计算机仍然在线、用户计算机当前的IP地址。
④Time On-line:用户计算机在线的时间。
连接页(Connection)
已与DNS2GO服务器建立连接时:
①Point my domain to my current IP address:用户与DNS2GO服务器连接成功后,服务器即将用户申请的域名绑定至该用户的当前IP地址,这样,Internet上的其他用户能通过此域名访问该用户的计算机。
②Set my IP address to:将域名绑定到其他的IP地址。
③Redirect web requests(with a www prefix)to this port:启用HTTP转发功能。这时其他用户发过来的HTTP请求(标准端口:80)被自动转发到指定端口(例如:8080)。如果用户的web服务器被安装在非标准端口,应在此进行相应设置。
未与DNS2GO服务器建立连接时:
①Send the visitor a web page that tells them I am off-line:用户当前未与DNS2GO服务器建立连接时,其他人如果访问该用户域名,DNS2GO服务器会发给其一个WEB页面告知被访问的用户当前不在线。
②Point my domain to this URL:其他用户的访问请求(仅限于HTTP协议)被转发到指定的WEB页面(URL)。
③Set my IP address to:其他用户的访问请求被转发到指定的IP地址。如果指定地址为0000,则拒绝所有的访问请求。
选项页(Option)
Use Proxy Server:
如果用户计算机是通过代理服务器的TCP Mapping方式使用DNS2GO客户端程序,则应选此项;但如果是通过NAT(如Sygate)或LSP(如本地计算机安装了Wingate30/40的WGIC)的,则不选。
①Proxy Address:代理服务器的IP地址(如:19216801)。
②Port:DNS2GO客户程序通过该端口与代理服务器建立TCP Mapping。
③Gateway Extensions:如果代理服务器上安装了网关扩展程序,则在此进行设置。网关扩展程序包含在DNS2GO的安装程序里,但它必须安装在代理服务器上。DNS2GO客户程序通过网关扩展程序得到代理服务器当前是否上网的信息,从而实现自动与DNS2GO服务器建立连接或断开连接的功能,如图-7。
Check Gateway Status Before Attempting DNS2Go Connection:试图连接到DNS2GO服务器前先连接到网关扩展程序,查询代理服务器状态。如果代理服务器不在线,DNS2GO客户的查询不会导致代理服务器拨号上网;如果代理服务器在线,则自动连接至DNS2GO服务器。
离线)或On-line(在线)。假设为离线时,DNS2GO客户将不做连接的操作;假设为在线时,DNS2GO客户仍然试图连接至DNS2GO服务器。前者为建议选项。
Gateway IP Address:网关扩展程序所在IP地址,应与代理服务器为同一地址(如:19216801)。
viPort:网关扩展程序侦听DNS2GO客户查询请求所使用的端口。
Run DNS2GO as a service:
将DNS2GO设置为系统服务,即在开机时自动运行,关机时才关闭。
Enable Event logging:
启用日志功能。
Auto connect to and disconnect from the DNS2Go service:
一旦用户计算机上网,DNS2GO客户就自动连接到DNS2GO服务器;一旦用户计算机下网,DNS2GO客户就断开与DNS2GO服务器的连接。如果用户计算机通过代理服务器上网,并希望使用此功能,必须在代理服务器上安装网关扩展程序。
Re-attempt connection failures X times:
与DNS2GO服务器连接失败时,重试的次数。
Show splash screen on startup:
启动DNS2GO客户程序时,在桌面显示一闪而过的窗口。
Transfer Email:
如果用户在申请域名时选择了第三项增值服务,则在此进行相应设置,如图-8、图-9,其中图-9中显示了DNS2GO客户成功连接到远程邮件主机且邮件传送已经开始。
①Mail Host:Deerfield为用户存储邮件的服务器名(maildns2gocom),端口为25。如果通过mapping代理上网,则应写入代理服务器的IP地址(如:19216801)及mapping端口(如:1025)。
②Transfer Mail Automatically When I Connect to the Internet:当DNS2GO客户程序侦测到用户已上网时,自动发送一条请求给maildns2gocom,要求其将存储的邮件传送过来。
③Transfer Now:手动发出传送请求。
拨号调度页(Scheduled Dialing)
用户可在这里指定DNS2GO客户在一周内的哪几天的哪个时间段,使用指定的拨号网络连接自动拨号上网。
时间同步页(Time Sync)
这里列出了几个Internet上的时间服务器,供用户校正本机时间。
注册页(Registration)
Tell A Friend:
以Email的方式通知朋友你申请的DNS2GO域名。
Get Free Key:
如果遗失了注册码,通过此功能可以再次得到,但要输入第一次申请时的个人信息。
Ground Control:
此功能让用户在线修改申请使用域名的profile、增值服务等。
目前goagent 311版本支持透明代理,很赞的功能!
建议搭建在Linux下,配合使用iptables规则将来发往80和443端口的数据重定向给goagent端口,可实现透明代理。客户端完全不知道goagent的存在。亲测可用。
另外也可以配合squid使用,squid启用透明代理,建立squid规则,默认走squid直接转发,被禁止的URL由squid转发给goagent处理。将来自80和443端口的数据重定向给squid端口即可。当然这种是设想,没有亲测。squid配置不好,可能还会拖慢访问速度。
您好,1、erlang有异常成熟、经过电信级别大规模验证的OTP应用库,只需要很简单的代码就能建立起异常稳定、容错性强、扩展性强、高并发的服务器框架,这也是erlang最宝贵的核心价值所在。 2、erlang是 天生的并发语言 : erlang的并发特性是语言
为什么golang的开发效率高?
golang是一编译型的强类型语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角。良好的避免了程序员因为“ { 需不需要独占一行 ”这种革命问题打架,也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人。
它有自己的包管理机制,工具链成熟,从开发、调试到发布都很简单方便;
有反向接口、defer、coroutine等大量的syntactic sugar;
编译速度快,因为是强类型语言又有gc,只要通过编译,非业务毛病就很少了;
它在语法级别上支持了goroutine,这是大家说到最多的内容,这里重点提一下。首先,coroutine并不稀罕,语言并不能超越硬件、操作系统实现神乎其神的功能。golang可以做到事情,其他语言也可以做到,譬如c++,在boost库里面自己就有的coroutine实现(当然用起来跟其他boost库一样恶心)。golang做的事情,是把这一套东西的使用过程简化了,并且提供了一套channel的通信模式,使得程序员可以忽略诸如死锁等问题。
goroutine的目的是描述并发编程模型。并发与并行不同,它并不需要多核的硬件支持,它不是一种物理运行状态,而是一种程序逻辑流程。它的主要目的不是利用多核提高运行效率,而是提供一种更容易理解、不容易出错的语言来描述问题。
实际上golang默认就是运行在单OS进程上面的,通过指定环境变量GOMAXPROCS才能转身跑在多OS进程上面。有人提到了的pomelo,开源本来是一件很不错的事情,但是基于自己对callback hell的偏见,我一直持有这种态度:敢用nodejs写大规模游戏服务器的人,都是真正的勇士 : ) 。
2、Erlang与Golang的coroutine有啥区别,coroutine是啥?
coroutine本质上是语言开发者自己实现的、处于user space内的线程,无论是erlang、还是golang都是这样。需要解决没有时钟中断;碰着阻塞式i\o,整个进程都会被操作系统主动挂起;需要自己拥有调度控制能力(放在并行环境下面还是挺麻烦的一件事)等等问题。那为啥要废老大的劲自己做一套线程放user space里面呢?
并发是服务器语言必须要解决的问题;
system space的进程还有线程调度都太慢了、占用的空间也太大了。
把线程放到user space的可以避免了陷入system call进行上下文切换以及高速缓冲更新,线程本身以及切换等操作可以做得非常的轻量。这也就是golang这类语言反复提及的超高并发能力,分分钟给你开上几千个线程不费力。
不同的是,golang的并发调度在i/o等易发阻塞的时候才会发生,一般是内封在库函数内;erlang则更夸张,对每个coroutine维持一个计数器,常用语句都会导致这个计数器进行reduction,一旦到点,立即切换调度函数。
中断介入程度的不同,导致erlang看上去拥有了preemptive scheduling的能力,而golang则是cooperative shceduling的。golang一旦写出纯计算死循环,进程内所有会话必死无疑;要有大计算量少i\o的函数还得自己主动叫runtimeSched()来进行调度切换。
3、golang的运行效率怎么样?
我是相当反感所谓的ping\pong式benchmark,运行效率需要放到具体的工作环境下面考虑。
首先,它再快也是快不过c的,毕竟底下做了那么多工作,又有调度,又有gc什么的。那为什么在那些benchmark里面,golang、nodejs、erlang的响应效率看上去那么优秀呢,响应快,并发强?并发能力强的原因上面已经提到了,响应快是因为大量非阻塞式i\o操作出现的原因。这一点c也可以做到,并且能力更强,但是得多写不少优质代码。
然后,针对游戏服务器这种高实时性的运行环境,GC所造成的跳帧问题确实比较麻烦,前面的大神 @达达 有比较详细的论述和缓解方案,就不累述了 。随着golang的持续开发,相信应该会有非常大的改进。一是屏蔽内存操作是现代语言的大势所趋,它肯定是需要被实现的;二是GC算法已经相当的成熟,效率勉勉强强过得去;三是可以通过incremental的操作来均摊cpu消耗。
用这一点点效率损失换取一个更高的生产能力是不是值得呢?我觉得是值得的,硬件已经很便宜了,人生苦短,让自己的生活更轻松一点吧: )。
4、基于以上的论述,我认为采用go进行小范围的MMORPG开发是可行的。
0条评论