skynet

浏览器缓存机制

耗尽温柔 提交于 2021-01-17 10:35:45
浏览器缓存机制,其实 主要就是 HTTP 协议定义的缓存机制(如: Expires ; Cache-control 等) 。但是也有非 HTTP 协议定义的缓存机制,如使用 HTML Meta 标签, Web 开发者可以在 HTML 页面的 <head> 节点中加入 <meta> 标签,代码如下: 1 < META HTTP - EQUIV = "Pragma" CONTENT = "no-cache" > 上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器拉取。使用上很简单,但只有部分浏览器可以支持,而且所有缓存代理服务器都不支持,因为代理不解析 HTML 内容本身。 下面我主要介绍 HTTP 协议定义的缓存机制。 Expires 策略 Expires 是 Web 服务器响应消息头字段,在响应 http 请求时告诉 浏览器在过期时间前 浏览器可以直接从浏览器缓存取数据,而无需再次请求。 下面是宝宝 PK 项目中,浏览器拉取 jquery.js web 服务器的响应头: 注: Date 头域表示消息发送的时间,时间的描述格式由 rfc822 定义。例如, Date: Mon,31 Dec 2001 04:25:57GMT 。 Web 服务器告诉浏览器在 2012-11-28 03:30:01 这个时间点之前,可以使用缓存文件。发送请求的时间是 2012-11-28

skynet源码分析之skynet_monitor

你。 提交于 2021-01-13 15:55:36
使用skynet框架中,偶尔会遇到A message from [ :0000000b ] to [ :0000000c ] maybe in an endless loop (version = 13187)类似的error,意思是0000000c服务处理0000000b服务发过来的某条消息时可能陷入死循环。 出现这种error的原因:业务层发生死循环或者比较耗时(超过5s)。 这就是skyent_monitor的作用。 1. skynet启动时会启动一个monitor线程,用来监测各个工作线程。5s循环一次,调用skynet_monitor_check()检测工作线程,稍后说明。 1 // skynet-src/skynet_start.c 2 static void * 3 thread_monitor( void * p) { 4 struct monitor * m = p; 5 int i; 6 int n = m-> count; 7 skynet_initthread(THREAD_MONITOR); 8 for (;;) { 9 CHECK_ABORT 10 for (i= 0 ;i<n;i++ ) { 11 skynet_monitor_check(m-> m[i]); 12 } 13 for (i= 0 ;i< 5 ;i++ ) { 14 CHECK

Go语言实战pdf

和自甴很熟 提交于 2020-11-14 11:59:17
下载地址: 网盘下载 内容简介 · · · · · · Go语言结合了底层系统语言的能力以及现代语言的高级特性,旨在降低构建简单、可靠、高效软件的门槛。本书向读者提供一个专注、全面且符合语言习惯的视角。Go语言实战同时关注语言的规范和实现,涉及的内容包括语法、类型系统、并发、管道、测试,以及其他一些主题。 作者简介 · · · · · · William Kennedy,是一位熟练的软件开发者,也是博客GoingGo.Net的作者。 Brian Ketelsen和Erik St. Martin是全球Go语言大会GopherCon的组织者,也是Go语言框架Skynet的联合作者。 李兆海,多年专注于后端分布式网络服务开发,曾使用过多个流行后端技术和相关架构实践,是Go语言和Docker的早期使用者和推广者,《第1本Docker书》的译者。作为项目技术负责人,成功开发了百万用户级直播系统。 目录 · · · · · · 第1章 关于Go语言的介绍 1 1.1 用Go解决现代编程难题 2 1.1.1 开发速度 2 1.1.2 并发 3 1.1.3 Go语言的类型系统 5 1.1.4 内存管理 7 1.2 你好,Go 7 1.3 小结 8 第2章 快速开始一个Go程序 9 2.1 程序架构 9 2.2 main包 11 2.3 search包 13 2.3.1 search.go 13 2

通俗易懂讲解epoll

心不动则不痛 提交于 2020-10-28 10:25:04
epoll 的本质是什么? 从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO

【算法和数据结构】字符串

回眸只為那壹抹淺笑 提交于 2020-10-09 09:50:03
字符集 charset 和字符编码 character encoding 参考:https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html 字符集是个集合,指明了其支持的所有字符有哪些。字符编码则为字符集中的每个字符指定了一个数字代号,解析的时候把代号替换为具体图形展示给用户。 常用的字符集有: ASCII:包含控制字符,英文,数字等。单字节字符编码,对应的字符编码就是 ASCII 码 GB2312 Unicode:对应的字符编码有: UTF-8:变长字符编码,可以表示任意 Unicode 编码,兼容 ASCII 编码(是 ASCII 的超集)。 UTF-16 UTF-32:4字节编码,定长,效率低 字符串是跟字符集绑定在一起的,每个字符串都要按照特定的字符集进行解析,否则就可能看到乱码。 字符串常见操作 通常在每种语言中,用双引号表示字符串,单引号表示字符。 最长公共前缀 LCP(Longest Common Prefix):表示两个字符串从头开始最长的相同子串。 对字符串及字串求哈希 哈希函数特点: 每个哈希函数的值域是固定的 对于不同的输入,其在值域内的分布大致均匀 同一个输入,哈希值唯一 输入的微小变动也会引起哈希函数值的巨大变化 不同输入,其哈希值可能相同,称为碰撞(冲突),但概率较低 字符串的哈希值

代码的品味

懵懂的女人 提交于 2020-08-19 04:32:25
我们经常谈论架构,谈论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,不仅我不同意,Robert C.Martin大叔也不同意,大叔认为“ 源码即是设计 ”。 在讨论具体的实施细则之前,我们不妨讨论一下什么是好代码?萝卜特(Martin)大叔认为:衡量代码质量的唯一标准是:WTF/min,也就是review代码的时候每分钟说“握草”的次数。这个定义虽有辱斯文,但粗野中不失调皮,调皮中又蕴含哲理。 好的代码如同文笔优美的散文,行云流水,如沐春风,阅读的时候,赏心悦目,带给人愉悦与启迪。 好的代码犹如构思精巧的小说,它或许不够平铺直述,但足够引人入胜,读到最后,你会豁然开朗,哦,原来是这样的啊,那一刻,你会觉得过程中的曲折和探索都是值得的。 好的代码,透过一个个函数,你仿佛可以窥视到作者有趣的灵魂,透过一行行代码,你仿佛在与一个充满智慧的朋友聊天,她总是思路清晰,逻辑严谨,娓娓道来。 而坏的代码,就像一个泥团,或者像一摊屎,阅读的时候,你仿佛被困于黑暗的迷宫,又仿佛在跟一个絮絮叨叨的人交谈,她的脑回路经常短路,说话含混不清,主次不分,叨逼半天,你依然get不到她的中心思想,你感觉智商受到了莫大的侮辱,甚至感觉像被人喂吃shit,你面露艰难神色,心中万马奔腾。 有很多区分好代码坏代码的规则,网上的文章也很多,我也看过不少,对于文章中提到的一些守则

skynet源码学习(一) linux无锁化编程

六眼飞鱼酱① 提交于 2020-08-19 02:59:26
以下是skynet源码: struct groupnode { int handle; struct skynetcontext ctx; struct groupnode next; }; struct group { int lock; struct groupnode node[HASHSIZE]; }; struct group G = NULL; inline static void lock(struct group g) { while (synclocktestandset(&g->lock,1)) {} } inline static void unlock(struct group g) { synclockrelease(&g->lock); }* gcc从4.1.2开始提供了sync系列的build-in函数,用于提供加减和逻辑运算的原子操作 type synclocktestandset (type ptr, type value, …):将ptr设为value并返回ptr操作之前的值。 void synclockrelease (type ptr, …):将ptr置0。 type只能是int, long, long long以及对应的unsigned类型 来源: oschina 链接: https://my.oschina.net/u/4340310

【科创人独家】云风:从创业到招安,自由的游戏玩家+务实的程序员

时光毁灭记忆、已成空白 提交于 2020-08-12 00:06:56
接触上5秒就能感受到云风的鲜明个性:标志性长发,没有微信、不用QQ,联络采访只能依靠微博私信(微博ID:玩家云风)——与之略有反差的是,采访全程不厌其烦的耐心回答,甚至对笔者超出约定时间长达20分钟的厚颜也没有流露不满。 参考阅读:《云风 一个编程的自由人》https://www.ituring.com.cn/article/58692/ 详细讲述云风2013年之前的经历 陌陌争霸,打响创业第一炮 云风最早闻名于业界,是因其《大话西游》、《梦幻西游》、《网易泡泡游戏》等国产网络游戏主力开发者的身份,并因此成为国产游戏行业教父级存在。 2011年,央视一改对《魔兽世界》的负面评价,首次点赞《魔兽世界》;同年,英雄联盟举办首届全球总决赛,PC GAME电子竞技化展现出了巨大的商业潜力…… 就在这一年,云风离职网易,与前上司詹钟晖(叮当)联手创办简悦。 科创人:您当时为何选择离开网易创业? 云风:有两个原因,首先是创业比较自由,想开源就开源,想做基础技术研究就去做;第二就是想做一款自己想象中比较美好的游戏。回过头来看, 起步阶段我们做得不算顺利,在代理和自研中摇摆导致举棋不定。 2011年我们购买了唐家三少(著名网络文学作家)的爆款作品《斗罗大陆》游戏改编权,但同时又代理了一款叫《狂刃》的游戏,后者问题多多,牵涉了研发团队不少精力去修补。最终前者的开发进度没有保障,后者发行后还赔了钱—

【科创人独家】云风:从创业到招安,自由的游戏玩家+务实的程序员

◇◆丶佛笑我妖孽 提交于 2020-07-25 09:09:22
接触上5秒就能感受到云风的鲜明个性:标志性长发,没有微信、不用QQ,联络采访只能依靠微博私信(微博ID:玩家云风)——与之略有反差的是,采访全程不厌其烦的耐心回答,甚至对笔者超出约定时间长达20分钟的厚颜也没有流露不满。 参考阅读:《云风 一个编程的自由人》 https://www.ituring.com.cn/article/58692/ 详细讲述云风2013年之前的经历 陌陌争霸,打响创业第一炮 云风最早闻名于业界,是因其《大话西游》、《梦幻西游》、《网易泡泡游戏》等国产网络游戏主力开发者的身份,并因此成为国产游戏行业教父级存在。 2011年,央视一改对《魔兽世界》的负面评价,首次点赞《魔兽世界》;同年,英雄联盟举办首届全球总决赛,PC GAME电子竞技化展现出了巨大的商业潜力…… 就在这一年,云风离职网易,与前上司詹钟晖(叮当)联手创办简悦。 科创人:您当时为何选择离开网易创业? 云风:有两个原因,首先是创业比较自由,想开源就开源,想做基础技术研究就去做;第二就是想做一款自己想象中比较美好的游戏。回过头来看,起步阶段我们做得不算顺利,在代理和自研中摇摆导致举棋不定。2011年我们购买了唐家三少(著名网络文学作家)的爆款作品《斗罗大陆》游戏改编权,但同时又代理了一款叫《狂刃》的游戏,后者问题多多,牵涉了研发团队不少精力去修补。最终前者的开发进度没有保障,后者发行后还赔了钱—

php中this,self,parent三个关键字的区别辨析

偶尔善良 提交于 2020-05-01 16:37:34
php中this,self,parent三个关键字的区别辨析 一、总结 一句话总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用。 1、self关键字使用的时候注意什么? self是小写,而不是大写,如果大写的话表示SELF这个类 12 $this ->lastCount = ++self:: $firstCount ; // 使用self来调用静态变量,使用self调用必须使用::(域运算符号) 2、self和this的区别是什么? self相当于是静态,this相当于是非静态 self代表的是本类:便于操作静态方法和属性(静态) this代表的是本对象:便于操作类的对象的属性和方法(非静态) 5 // 定义属性,包括一个静态变量 6 private static $firstCount = 0 ; 7 private $lastCount ; 8 9 // 构造函数 10 function __construct() 11 { 12 $this ->lastCount = ++ self :: $firstCount ; // 使用self来调用静态变量,使用self调用必须使用::(域运算符号) 13 } 14 15 // 打印最次数值 16 function printLastCount() 17 { 18 print (