• skynet 的启动流程中的异步 IO 问题
    有同学向我反应,自从 skynet 的 IO 库重写后,Mac OSX 上便无法启动了。 我检查了一下,直接原因是 kqueue 部分写的不对。kqueue 和 epoll 的 api 设计还是有些区别的,epoll 的 api 可以合并读写消息,但 kqueue 读是读,写是写。当时随手写好后一直没有在真实环境下测试,所以一直是有问题的,只是这次另外一个问题将它暴露了。 我新写的 IO 库是异步操作的。异步处理针对任何 IO 请求,其中也包...
  • 在 C 中设置 Lua 回调函数引起的一处 bug
    我们的服务器框架提供了一个 C 接口, 在 RPC 调用时, 回调一个事先注册的函数. C 中标准的回调函数的接口设计, 标准方法是设置一个 C 函数指针加一个 void * 类型的数据指针. 由于我们的游戏逻辑使用 Lua 来实现, 所以这里只需要实现一个 C 函数去调 Lua 机里的函数, 而对应的 void * 自然就是 lua_State * 。 今天,同事在实现服务的热更新功能。发现多次热更新 lua 写的服务会导致一处 core...
  • 正确的迭代处理对象
    昨天在写一个 AOI 模块,设计时又碰到一个对象迭代的老问题,必须谨慎对待,文以记之。 缘起: 当对象 A 进入 B 的 AOI 区域时,会触发一个 Enter 事件。这个事件处理是以回调函数的形式完成,如果回调函数中再次调用 AOI 模块,产生一次间接递归,就有可能破坏 AOI 模块内部的某些迭代过程。 更要命的是,如果回调函数内删除了一些相关对象,很有可能引起对已释放对象的访问错误。 这类问题在各种对象管理的程序框架中经常出现。除了上...
  • 实现一个 timer
    前段时间写过一篇 blog 谈到 用 timer 驱动游戏 的一个想法。当 timer 被大量使用之后,似乎自己实现一个 timer 比用系统提供的要放心一些。最近在重构以前的代码,顺便也重新实现了一下 timer 模块。 这次出于谨慎,查了一些资料,无意中搜到这样一篇文章:Linux内核的时钟中断机制 。真是一个不错的设计啊 :D 和我的 timer 实现的思路是一致的,但是在细节上要优秀。 ...
  • Scrapy框架| Scrapy中spiders的那些事......
    来源:JAP君   链接:https://mp.weixin.qq.com/s/Rdv-ncSzlol_IpJtQ7TRjQ1写在前面的话     今天继续更新scrapy的专栏文章,今天我们来聊一聊scrapy中spiders的用法。我们知道在整个框架体系中,spiders是我们主要进行编写的部分,所以弄清楚spiders这一块的知识,对我们学习scrapy有着很大的好处。但是这一章里大多数都是一些spiders里面的一些模板的介绍,实战代码可能会比较少,但是大家了解了这些之后,对于scrapy的使用会更...
  • 深入理解php的输出缓冲区(output buffer)
    微信公众号:PHP在线这篇文章是翻译自Julien Pauli的博客文章PHP output buffer in deep,Julien是PHP源码的资深开发和维护人员。这篇文章从多个方面讲解了PHP中的输出缓冲区以及怎么使用它。输出缓冲区可能一直都是PHP开发人员的一个盲点,很多人可能只是知道这个东西,而且也知道大概怎么使用,但对于它为什么是这个样子,以及还可能是其他什么样子,可能并不了解,这篇文章可以解决你的所有困惑!引言大家都知道PHP中有一个名为“输出缓冲区”层(layer)的东西。这篇文章就是来讲...
  • 深入理解php的输出缓冲区(output buffer)
    这篇文章是翻译自Julien Pauli的博客文章PHP output buffer in deep,Julien是PHP源码的资深开发和维护人员。这篇文章从多个方面讲解了PHP中的输出缓冲区以及怎么使用它。输出缓冲区可能一直都是PHP开发人员的一个盲点,很多人可能只是知道这个东西,而且也知道大概怎么使用,但对于它为什么是这个样子,以及还可能是其他什么样子,可能并不了解,这篇文章可以解决你的所有困惑!引言大家都知道PHP中有一个名为“输出缓冲区”层(layer)的东西。这篇文章就是来讲解它到底是个什么东西的...
  • 面试官想知道你有多理解call,apply,bind?
    函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础扎实,绕不开这些基础常用的API,这次让我们来彻底掌握它们吧!目录call,apply,bind的基本介绍call/apply/bind的核心理念:借用方法call和apply的应用场景bind的应用场景中高级面试题:手写call/apply、bindcall,apply,bind的基本介绍语法:fun.call(thisArg,...
  • 重磅推荐:六个让前端既高效又有趣的开发神器
    loonggg读完需要5分钟速读仅需2分钟我最近已经大约应该有快一年的时间没有再开发 Android 了,自从来到二线城市,做 Android 开发也是断断续续,一会 Android ,一会小程序开发,一会又用 Vue 做前端开发,中间也穿插着各种技术管理和团队管理的工作。在非一线城市做开发工作,给我最大的感受就是需要工程师什么都会,最好是全栈,你懂得越多越有价值,而不是你懂得越精,越深越有价值。由于最近半年一直在做 Vue 的开发工作,今天我就整理了 6 个 Vue 相关的工具和开源库,都非常有价值,希望...
  • 你了解Promise吗?
    导读在异步编程中,Promise扮演了举足轻重的角色,它解决了ajax请求过程中的回调地狱的问题,令代码更具可读性。下面的介绍中,笔者会通过一些片段代码,加上一些其自己的理解带大家一起重新温故一下Promise为编程所带来的便利。Promise是抽象异步处理对象以及对其进行各种操作的组件;Promise很重要!实例:var promise = new Promise;//使用promise.then.catch;注意:本文中的函数表达式均采用ES6的箭头函数表达式的语法,你若还不是很清楚,请自行查阅[1]。介绍完回调函数,要回到Promise的主场了。这时Promise就要闪亮登场了,Promise中强大的then方法,可以解决刚刚出现的恐怖的回调地狱问题,并且让代码更优雅。
  • 教你用Python爬虫爬取知乎妹子信息,还愁找不到女朋友吗?
    既然需要用到scrapy爬虫框架,那就来科普一下scrapy爬虫框架吧~Scrapy:1、Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取 web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。  parse\_follow会解析用户列表,同时把动态的人员列表POST请求发送只引擎,回调函数是parse\_post\_follow,把解析好的用户主页链接请求也发送到引擎,人员关系写入mongo。本地运行请注意: 爬虫依赖mongo和rabbitmq,因此这两个服务必须正常运行和配置。
  • 面试问到 Promise,这样回答最完美了
    Promise是异步编程的一种解决方案,比传统的回调函数和事件更合理和强大。这也是Promise这个名字的由来。再对Promise对象添加回调函数也会立即得到这个结果。基本用法ES6规定,Promise对象是一个构造函数,用来生成Promise实例。下面代码创造了一个Promise实例。Promise实例生成后,可以用then方法分别指定resolve状态和rejected状态的回调函数。这两个函数都接受Promise对象传出的值作为参数。Promise新建后就会立即执行。它的作用是为Promise实例添加状态改变时的回调函数。这时,前一个回调函数可能返回一个还是Promise对象,这时候一个回调函数就会等该Promise对象的状态发生变化,才会被调用。
  • 从零开始写一个符合Promises/A+规范的promise
    一. 基础版本目标可以创建promise对象实例。promise实例传入的异步方法执行成功就执行注册的成功回调函数,失败就执行注册的失败回调函数。因为是同步任务,所以当我们的promise实例reslove时,它的then方法还没执行到,所以回调函数还没注册上,这时reslove中调用成功回调肯定会报错的。实现promise对象的状态改变,改变只有两种可能:从pending变为fulfilled和从pending变为rejected。实现一旦promise状态改变,再对promise对象添加回调函数,也会立即得到这个结果。
  • 从零开始写一个符合Promises/A+规范的promise
    一. 基础版本目标可以创建promise对象实例。promise实例传入的异步方法执行成功就执行注册的成功回调函数,失败就执行注册的失败回调函数。因为是同步任务,所以当我们的promise实例reslove时,它的then方法还没执行到,所以回调函数还没注册上,这时reslove中调用成功回调肯定会报错的。实现promise对象的状态改变,改变只有两种可能:从pending变为fulfilled和从pending变为rejected。实现一旦promise状态改变,再对promise对象添加回调函数,也会立即得到这个结果。
  • 【JS】368- 浅析JavaScript异步
    一直以来都知道JavaScript是一门单线程语言,在笔试过程中不断的遇到一些输出结果的问题,考量的是对异步编程掌握情况。JavaScript异步都是通过回调形式完成的,开发过程中一直在处理回调,可能不知不觉中自己就已经处在回调地狱中。之前说过JavaScript是单线程作业,但是并不代表浏览器就是单线程的。在JavaScript引擎中负责解析和执行JavaScript代码的线程只有一个。即浏览器搞了几个其他线程去辅助JavaScript线程的运行。假如有一段JavaScript从头到尾执行时间比较长,那么在执行期间任何UI更新都会被阻塞,界面事件处理也会停止响应。突然有个疑问,既然如此为什么JavaScript没有使用多线程作业呢?
  • 【JS】370- 总结异步编程的六种方式
    以下为几种异步编程方式的总结,希望与君共勉。回调函数事件监听发布订阅模式PromiseGenerator async 异步编程传统的解决方案:回调函数和事件监听初始示例:假设有两个函数, f1 和 f2,f1 是一个需要一定时间的函数。Promise 的状态一旦改变之后,就不会在发生任何变化,将回调函数变成了链式调用。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式, yield是暂停执行的标记。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
  • JS 服务器推送技术 WebSocket 入门指北
    最近在工作中遇到了需要服务器推送消息的场景,这里总结一下收集整理WebSocket相关资料的收获。HTTP与WS协议结构WebSocket协议标识符用 ws表示。`wss协议表示加密的WebSocket协议,对应HTTPs协议。Websocket 其实是一个新协议,但是为了兼容现有浏览器的握手规范而借用了HTTP的协议来完成一部分握手。WebSocket是纯事件驱动的,一旦连接建立,通过监听事件可以处理到来的数据和改变的连接状态,数据都以帧序列的形式传输。Connection:Upgrade表示浏览器通知服务器,如果可以,就升级到webSocket协议。
  • 从零开始写一个符合Promises/A+规范的promise
    一. 基础版本目标可以创建promise对象实例。promise实例传入的异步方法执行成功就执行注册的成功回调函数,失败就执行注册的失败回调函数。因为是同步任务,所以当我们的promise实例reslove时,它的then方法还没执行到,所以回调函数还没注册上,这时reslove中调用成功回调肯定会报错的。实现promise对象的状态改变,改变只有两种可能:从pending变为fulfilled和从pending变为rejected。实现一旦promise状态改变,再对promise对象添加回调函数,也会立即得到这个结果。
  • Java面试中也会问的nodejs异步I/O和事件驱动​
    接触nodejs有两个月,对nodejs的两大特性一直有点模糊,即异步IO和事件驱动。通过对《深入浅出nodejs》和几篇博客的阅读以后,有了大致的了解,总结一下。几个例子在开始之前,先来看几个简单例子,这也是我在使用nodejs时候遇到的几个比较困惑的例子。example 4varfs=require;vardebug=require;debug;setTimeout;setTimeout;debug;/**Sat,21May201608:53:27GMTexample4beginSat,21May201608:53:27GMTexample4endSat,21May201608:53:27GMTexample4timeout1Sat,21May201608:54:09GMTexample4timeout2//注意这里的时间晚了好久*/question 4和上面的问题一样,为何timeout1的计算密集型工作将会阻塞timeout2的回调函数的执行?接下来我们就带着上面几个疑惑去理解nodejs中的异步IO和事件驱动是如何工作的。异步IO首先来理解几个容易混淆的概念,阻塞IO和非阻塞IO,同步IO和异步IO。博主一直天真的以为非阻塞I/O就是异步I/O T_T,apue一直没有读懂。
  • 深入理解 JavaScript 回调函数 [每日前端夜话0xDF]
    从 javascript 代码中调用该函数时。回调函数是一个作为参数传给另一个 JavaScript 函数的函数。在 JavaScript 中函数被看作是一类对象。如何使用回调函数我认为与其告诉你 JavaScript 回调函数的语法,不如在前面的例子中实现回调函数更好。为了模拟这种行为,我们用 JavaScript 的 setTimeout() 函数。JavaScript 被认为是单线程脚本语言。单线程是指 JavaScript 一次执行一个代码块。当 JavaScript 忙于执行一个块时,它不可能移到下一个块。Javascript 回调地狱当多个异步函数一个接一个地执行时,会产生回调地狱。然后在用户中搜索 JavaScript 库的主要贡献者。
公众号
关注公众号订阅更多技术干货!