6.824的课程通常是在课前让你做一些准备.一般来说是先读一篇论文,然后请你提一个问题,再请你回答一个问题.然后上课,然后布置Lab. 第二课的准备-Crawler 第二课的准备不是论文,是让你实现Go Tour里面的crawler.Go Tour里面原有的实现是串行的,并且可能爬到相同的url.要求让你并行并去重. 简单想法就是,为了实现并行,爬每个url都是用goroutine:为了实现去重,每次开爬就把url放到map中. 不过这里有个知识点,Crawler函数最后返回成功,所有url都要…
什么是Map-Reduce呢? Map指的是一个形如下面定义的函数. def Map(k, v): //return [(k1, v1), (k2, v2), (k3, v3), ...] pass 它接受一个key和一个value,返回一组所谓的中间值.注意,返回的不是一个dict,所以k1可能等于k2. Reduce指的是一个形如下面定义的函数. def Reduce(k, [v1, v2, v3, ....])://return v pass 它接受一个key和该key对应的所有在Map函…
Google File System 第三课的准备是阅读论文GFS.该论文是分布式系统中经典论文之一. 读完做一点小总结. GFS的feature 1. 非POXIS接口API,支持对文件和文件夹的创建,读,写,增加,重命名和创建快照操作. 2. 有多个商用Linux机器做节点,称为chunk server,数据存放在chunk server上. 3. 有一个master节点,用于发送控制指令. 4. client通过调用API,和master做控制命令交换,和check server 做数据交…
本文参考 本篇文章是对<Netty In Action>一书第七章"EventLoop和线程模型"的学习摘记,主要内容为线程模型的概述.事件循环的概念和实现.任务调度和实现细节 线程模型概述 线程模型指定了操作系统.编程语言.框架或者应用程序的上下文中的线程管理的关键方面.可见,线程模型确定了代码的执行方式,如何以及何时创建线程将对应用程序代码的执行产生显著的影响,因此开发人员需要理解与权衡不同的模型 在早期的 Java 语言中,我们使用多线程处理的主要方式无非是按需创建和…
阅读目录 前言 成熟的解决方案 剖析 性能测试 结语 一.前言 在上一篇分布式系统系列中<分布式系统中的必备良药 —— 服务治理>中阐述了服务治理的一些概念,那么与服务治理配套的必然会涉及到RPC框架.在当前互联网的大背景下,RPC的运用应该大家或多或少都有涉及,国内外的RPC框架也是百花齐放.那么各个RPC框架各自有什么特点,另外RPC的核心点又是哪些,我们该如何去选择是本文需要讲述的内容.本文会围绕.Net技术栈来展开,暂不讨论诸如dubbo之类对.Net 不太友好的框架. 二.成熟的解决…
本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息可以帮助我们辨别每个线程.知道它的一些信息 ID:每一个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级. 优先级别在1-10之间.1是最低级,10是最高级. Status:线程状态.在java中,线程仅仅有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 如今写一个程序,将线程的信息保存到文件里方便查看…
因为工作的原因,最近打算看一些分布式学习的资料.其中这个http://book.mixu.net/distsys/就是一篇非常适合分布式入门的介绍. 这个短小的材料有下面5个小的章节,图文并茂,也没有太难的概念,非常推荐. 基础知识.主要是一些基本概念,例如可扩展性(scalability),可用性(availability)(马上就要写成bilibili了),性能(performance),容错(fault tolerance). 上下层的抽象.CAP,敲黑板,这个是个很入门和重要的理论. 时…
1.介绍一下Spring的事物管理 参考:Spring 学习7 -事务 2.Spring如何处理线程并发问题    Spring使用ThreadLocal解决线程安全问题 参考:Spring学习11- Spring使用ThreadLocal解决线程安全问题-比如数据库连接 我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域.就是因为Spring对一些Bean(如RequestContextHolder.Tra…
1.线程模型 2.参考资料: 源码级强力分析hadoop的RPC机制:http://weixiaolu.iteye.com/blog/1504898Hadoop RPC框架:http://blog.csdn.net/thomas0yang/article/details/41211259 Hadoop RPC使用与实现:http://watter1985.iteye.com/blog/1698558 netty 能做什么?:http://www.zhihu.com/question/243223…
场景 什么是分布式系统 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统. 分布式系统是建立在网络之上的软件系统. 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的数据访问框架(ORM)是关键. 单一应用结构特点 适用于小型网站,…
Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这时由于它没有捕获这个中断,在捕获中断之前先看一下官方对于interrupt()的一些说明: 那难道在线程中不调用上述的三个方法在线程被中断之后就收不到中断异常了么?下面来试验下: 可以看到也可以正常的读取到中断的状态,那看一下interrupt()的源码: 而jdk中所说的自动捕获中断异常的话则需要…
学习实现一个简单的RPC框架. 工程主要目录分级结构: rpc-common: 公共基础包,能力提供包 rpc-provider: 服务提供者 rpc-consumer:服务消费者 rpc-service:定义接口 rpc-service-impl:接口实现 核心实现:通过动态代理的方式映射接口实例,然后调用服务提供的方法: rpc-consumer只需要依赖rpc-common 和 rpc-service,底层通过走http的方式去调用Service的接口.当然不一定要走Http才能调用. g…
多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的static变量,假如有10个线程,每个线程处理完上去累加下结果,然后后面用一个死循环(或类似线程阻塞的方法),去数这个结果,达到10个,说明大家都爽完了,可以进行后续的事情了,这个想法虽然土鳖,但是基本上跟语言无关,几乎所有主流编程语言都支持. package yjmyzz.test; publi…
关于这个问题,先了解一下Thread类方法中被废弃的那些方法.suspend(), resume(),stop()/stop(Throwable obj),destroy() 首先,stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了,没必要去看了.我们只需瞧瞧suspend(), resume(), stop()这三个就行了; suspend()——让当前线程暂停执行 resume()——让当前线程恢复执行 当调用suspend()的时候,线程并没有释…
使用子线程获取网络图片1.采用httpUrlConnection直连方式获取图片2.采用子线程方式获取 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout…
一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开 Chrome.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用QQ ,或者Xcode 都需要在线程中执行 3.线程的串行 1个线程中任务的执行是串行…
一个.java创建两个线程的方法 1.从java.lang.Thread派生一个新类线程类,其覆盖run()方法 2.实现Runnable接口.重载Runnable接口中的run()方法. 使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象. 二.java提供的两种创建线程的差别 java中类是单继承的,当定义一个新的线程类的时候.它仅仅能扩展一个外部类.那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其它类,无法实现复杂…
通过lxml的方式去分析数据,将爬到的数据放到file中的html中代码如下# 用线程去爬虫 from urllib.request import Request from urllib.request import urlopen from time import sleep,ctime from lxml import etree import _thread; ii= headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT…
阅读http://book.mixu.net/distsys/replication.html的笔记,是本系列的第四章 拷贝其实是一组通信问题,为一些子问题,例如选举,失灵检测,一致性和原子广播提供了上下文. 同步拷贝 可以看到三个不同阶段,首先client发送请求.然后同步拷贝,同步意味着这时候client还在等待着请求返回.最后,服务器返回. 这就是N-of-N write,只有等所有N个节点成功写,才返回写成功给client.系统不容忍任何服务器下线.从性能上说,最慢的服务器决定了写的速度…
这是阅读 http://book.mixu.net/distsys/time.html 的笔记,是该系列的第三章. 为什么时间和顺序很重要呢?为什么我们关系事件A发生在事件B之前? 因为分布式系统要解决的问题是把单机上的问题通过多机来解决.然而传统单机的程序总是假设确定的顺序.对于分布式程序来说,正确性最简单的定义就是,跑起来像一台单机上运行的程序. 全序和偏序 具体的定义大家可以去翻离散书.简单地说,全序就是在集合里任何两个元素都可以比较,分出大小.偏序中,某些元素是没办法比较大小的. 在单节…
本文是阅读 http://book.mixu.net/distsys/abstractions.html 的笔记. 第二章的题目是"Up and down the level of abstraction".这一章里面,作者主要介绍了分布式系统里面的一个重要概念:CAP理论. 什么是CAP理论呢?就是说在任何情况下,分布式系统只能满足下面三项中的两个: 一致性(Consistency),这里指的强一致性. 可用性(Availability). 对网络分割容错(Partition tol…
在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒                   这一般使用Timer(定时器)来解决: ThreadPool类提供一个由系统维护的线程池(可以看作一个线程的容器),该容器需要 Windows 2000 以上系统支持,因为其中某些方法…
Java线程有哪些不太为人所知的技巧与用法? 萝卜白菜各有所爱.像我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法.比如说线程.没错,就是线程.或者确切说是Thread这个类.当我们在构建高可扩展性系统的时候,通常会面临各种各样的并发编程的问题,不过我们现在所要讲的可能会略有不同. 从本文中你将会看到线程提供的一些不太常用的方法及技术.不管你是初学者还是高级用户或者是Java专家,希望都能看一下哪…
http://blog.csdn.net/zhu_tianwei/article/details/40887885 在一般使用RabbitMQ做RPC很容易.客户端发送一个请求消息然后服务器回复一个响应消息.为了收到一个响应,我们需要发送一个'回调'的请求的队列地址.我们可以使用默认队列(在Java客户端除外). AMQP协议给消息定义了14个属性.大部分的属性很少使用,除了下面几个:   deliveryMode: 将消息标记为持久(值为2)或瞬态(任何其他值).你可能记得在第二个教程中使用了…
一.新增原子类LongAdder LongAdder是JDK8中AtomicLong的增强工具类,它与AtomicLong最大的不同就是:在多线程场景下,LongAdder中对单一的变量进行拆分成多个变量,这些变量分为两类base和Cell.base是基础值,默认一般为0:而Cell就是我们所拆分的值,它可以有多个.所以当获取LongAdder的值时就是把base和每个Cell的值相加. 为什么要拆分成多个Cell呢?这是因为在多线程场景下,如果多个线程都在对同一个变量进行操作,为了使这个变量原…
除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在spring boot 的启动类上加上注解:@EnableAsync //开启同步线程必须加上注解 @EnableAsync @SpringBootApplication public class ThemApplication { public static void main(String[] ar…
摘要: 源代码参见我的github:https://github.com/YaoZengzeng/MIT-6.824 Lab3: Paxos-based Key/Value Service Introduction 在Lab2中我们依靠单个的master view server来获取primary.如果view server不可用(崩溃了或者有网络问题),那么key/value service就不工作了,即使primary和backup都是可用的.而且它在处理server(primary或者ba…
源代码参见我的github:https://github.com/YaoZengzeng/MIT-6.824 Lab 2:Primary/Backup Key/Value Service Overview of lab 2 在本次实验中,我们将使用primary/backup replication 来提供能够容错的key/value service.为了让所有的clients和severs都认同哪个server是primary,哪个server是backup,我们将引入一个master ser…
源代码参见我的github: https://github.com/YaoZengzeng/MIT-6.824 Part I: Word count MapReduce操作实际上就是将一个输入文件拆分成M份,交由M个Map task进行操作.每个Map task生成R个包含中间键值对的结果.R个Reduce task执行Reduce操作,其中第i个Reduce task操作每个Map task的第i个输出文件.最终,生成R个结果文件,通过Merge操作,将结果生成一个输出文件. 1.mapred…
线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascript,页面渲染等操作,当我们使用ajax向服务端发起请求,由于这个过程很慢,ajax的异步模式可以让我们无需一直等待服务端的响应,而在这个等待结果时间里做其他的事情,这个模式在线程技术力称之为Future模式. Future模式和我前面文章里说到的html5技术里的worker技术差不多,当我们一个…