这里的blocking signal里的blocking并不是传统意义上的针对IO的blocking, 尽管这可能是引起ioloop阻塞的一个原因之一。在这里,blocking指的是ioloop在epoll返回之后开始依次处理各监听文件句柄上的IO事件时,直到下一次进入epoll调用的这段时间的ioloop的状态。我们知道Tornado是单线程的,在处理完某次epoll调用返回的读写就绪事件之前,Tornado无法启动下次epoll监听,所以这段时间理论上是越短越好,这样,ioloop可以充分及时的获取就绪文件句柄,不会影响整体IO性能。然而在实际的使用过程中,难免会出现某次处理时间过长,从而导致ioloop的blocking时间过
继续阅读 »
为什么 UIScrollView 的滚动会导致 NSTimer 失效?
定时器里面有个runoop mode,一般定时器是运行在Defaultmode上但是如果滑动了这个页面,主线程runloop会转到UITrackingRunLoopMode中,这时候就不能处理定时器了,造成定时器失效,原因就是runroop mode选错了。
解决办法有2个:
1:更改mode为NSRunLoopCommonModes(无论runloop运行在哪个mode,都能运行)
2:切换到主线程来更新UI界面的刷新
继续阅读 »
学习Java多线程中会遇到使用volatile关键字的情况。
volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型.
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchroniz
继续阅读 »
生产环境之运维
最近在生产环境上游历了一番,大版本升级,流量控制,问题的追根索源,甚是各种艰辛。
线上资源配置问题
池化连接
必须清楚了解业务进行设置
主要是连接数个数与闲置回收的时间: 防止连接数瓶颈。
超时设置:防止在网络抖动或者数据库不可用的状况下,业务核心线程被阻塞,连接池爆浆。
e.g. 数据库连接池
池的最小最大值(不同数据库需)
从DPCP获取连接超时
连接超时
读超时
socket超时
重试次数与每次重试相隔时间
NoSQL
容量 (dimension)
TTL
连接管理
Dev提供友好的配置指引,工程公式及原理,让Ops了解当前系统在不同的部署环境下如何合理配置系统资源。
系统连接数及计算公式
客户端(e.g
继续阅读 »
Java部分(基础)
基础部分1 https://www.imooc.com/learn/85
1. 基本的语句(if else这些)
2. 数组,函数
基础部分2 https://www.imooc.com/learn/124
1. 类和对象(构造函数、静态变量、静态方法)
2. 继承(方法重写、抽象类)
3. 接口
基础部分3
1. 集合,泛型,Map,迭代器(Iterator)
2. 常用的工具类(String、File、Date、Calendar、)
3. 异常处理(try……catch)
4. 输入输出流(可以后面在Android需要时学习)
5. 多线程(可以后面在Android需要时学习)
Android(基础
继续阅读 »
定时任务是非常常见的需求,比如定期的去汇总数据,定期的清除垃圾等。
Java 提供了很多定时任务的方案,下面简单的列举一下。
more
利用 thread 的sleep
新开一个线程,死循环运行,通过 sleep 的达到定时运行的效果。
public static void main(String[] args) {
final long timeInterval = 1000;
Runnable runnable = new Runnable() {
public void run() {
while (true) {
继续阅读 »
mdtoc start
表现
解决方法
定位问题过程
gdb-python: 搞清楚python程序在做什么
准备gdb
接入gdb
查看线程
查看调用栈
coredump
其他命令
pyrasite: 连接进入python程序
psutil 查看python进程状态
guppy 取得内存使用的各种对象占用情况
无法回收的对象
不可回收对象的例子 🌰
objgraph 查找循环引用
继续阅读 »
之前看了一篇关于,Event Loop的文章,做了下面的笔记。
Event Loop 是解决 JavaScript 单线程问题的一种运行机制
继续阅读 »
我们的常用的系统中,程序的工作通常是有事件驱动和消息驱动两种方式,在Android系统中,Java应用程序是靠消息驱动来工作的。
消息驱动的原理就是:
1. 有一个消息队列,可以往这个队列中投递消息;
2. 有一个消息循环,不断从消息队列中取出消息,然后进行处理。
在Android中通过Looper来封装消息循环,同时在其中封装了一个消息队列MessageQueue。
另外Android给我们提供了一个封装类,来执行消息的投递,消息的处理,即Handler。
more
在我们的线程中实现消息循环时,需要创建Looper,如:
cla
继续阅读 »
浏览器中的javascript引擎是单线程的,如果在setTimeout设定的时间到达时,javascript引擎还在处理另外的代码,那么setTimeout设定的事件就只有排队等待了。所以一般来说setTimeout设定的时间都是不准确的,会比设定的晚。就算setTimeout时间设定为0,也不一定马上执行,这样设定是把想执行的函数放在javascript引擎执行队列的末尾。
继续阅读 »