Masutangu

也許我這一生 始終在追逐那顆九號球

Elric 使用手册

这篇文章正式介绍下我之前用 Python 实现的分布式任务框架 Elric,包括其API,架构,周边能力以及实现细节。 读者可以先阅读之前的这篇文章《Python实现的分布式任务调度系统》来了解Elric的起源和早期设计的思想。 一. 简介 Elric 是一个 Python 实现的简单的分布式任务框架。Master-Worker 架构,Worker 向 Master 提交任务和执行 Ma...

Python 笔记

这篇文章整理了python相关的资料,包括性能优化、常见错误和高级用法。 注:本文内容整理自网上博客,《Python Cookbook》等,非原创。 性能优化 1. 字典和列表 Python 字典中使用了 hash table,因此查找操作的复杂度为 O(1),而 list 实际是个数组,在 list 中,查找需要遍历整个 list,其复杂度为 O(n),因此对成员的查找访问等操作字典...

Matplotlib 笔记

最近工作需要在邮件内容中展示一些图表,例如折线图、柱状图、圆饼图等。采用的方案为: 用Matplotlib生成图表并保存成文件 将图片添加为邮件的附件 最后通过src="cid:0"的方式将图片嵌入到邮件正文中 这篇文章主要对 Matplotlib 的使用做些总结,包括 Matplotlib 如何配置显示中文字体,折线图/柱状图/圆饼图相关介绍,matplot子图的概念。...

Tcpcopy 源码阅读

tcpcopy是网易开源的一款压测工具,可以实时复制线上流量到测试环境,从而利用线上真实的用户流量来对测试环境进行仿真压测。 由于网上关于tcpcopy的介绍并不多,我对tcpcopy的原理也很感兴趣。因此在学习其源码后写下这篇文章和大家分享。这里非常感谢tcpcopy的作者王斌老师的热心指导。 架构 第一种架构: 实现原理: 从数据链路层捕获客户端的请求包,...

iOS 初体验

客户端对做后端的我来说,一直是黑盒子般。自从换了Mac,就寻思着什么时候学习学习iOS开发。这几个月断断续续花了时间,先是看了Stanford的cs193p课程,后来又读了<iOS Programming The Big Nerd Ranch Guide>,最后写了个非常简单的App:ToDo。今天这里分享下iOS一些学习笔记,素材取自cs193p的ppt,apple的开发者文档...

Python 进程池的坑:Pickling Error!

前阵子在跑Elric下的爬虫任务时,发现了worker进程有偶现的异常挂起的现象,通过strace看到worker进程block在futex(…, FUTEX_WAIT,…)这里,查看了worker的标准输出,发现打印了这么一行东西: 1 File “../multiprocessing/queues.py”, line 266, in _feed send(obj) PickingErr...

使用 binlog 实时监控 Mysql 数据更新

上一篇文章《UDF+Trigger实时监控Mysql数据更新》介绍了用UDF+Trigger的方式来监控Mysql数据的更新,这次介绍下使用binlog监控数据更新的方法。 binlog 简介 The binary log is a set of log files that contain information about data modifications made to ...

水滴石穿-第三期

不积跬步,无以至千里;不积小流,无以成江海 Instagram Is the Best Social Network 作者谈他为何觉得Instagram是最好的社交应用,主要是以下三点: 简单 信息简单:Instagram以纯图片的方式传递,没有超链接,没有一大段文字 操作简单:点赞或者只是浏览。 安静 不打扰用户...

UDF + Trigger 实时监控 Mysql 数据更新

最近在做缓存相关的事情,需要在mysql的上层架一层缓存,以缓解mysql的压力,简单的架构图如下: 大家都知道,缓存带来性能上的提高,然而却有数据不一致的可能。比方说修改了mysql的数据,但是用户读取到的缓存数据还未更新,这时就会有不一致的问题。 这样就需要一种机制来监控mysql中数据的变化以更新缓存: 方案 有两种办法可以实时监控mysql,一是利用mysql的binlo...

Elric Change Log II

最近有些时间,于是对分布式框架Elric做了些优化,同时新增了些新特性,在这里分享给大家。 优化Worker拉取任务逻辑 之前的逻辑是从任务队列里拉取任务后就塞给进程池,会导致worker不断从任务队列里取任务,然后在进程池里等待执行。这样的话,Worker不是按需取任务,而是揽一大堆活然后一直积压在手里做不完,而后续拉起空闲的Worker则取不到任务。 之前的逻辑,拉取任务后直接塞...