在介绍quasar/Pulsar之前请让我说点题外话,我觉得这是研究他的原因,也是对当前jvm上脚本语言自己了解的概述。

已经使用emacs live学习和开发clojure  一段时间,当初犹豫过到底要研究clojure还是scala,自己有java的几年开发经验,这样的打算很正常,但是具体专注那个是好久没有下定决心。我在公司和另外一个同事研究过twitter的zipkin,那个是用scala写的,看其源码痛苦不堪,本来对scala就不了解还要翻译成java版本,但是奇迹的是最后我们翻译成功了,但是性能觉对没有zipkin好的,只能勉强翻译出来。后来我还用php写了一个zipkin的客户端 https://github.com/malakaw/zipkin_php_scribe  。扯远了,后来我还是选择了clojure, 有《黑客和画家》对我的影响,(此处不想写太多具体是clojure好还是scala的话,这个,,,争论的人太多了,我就不多说了);不过我的体会是,现在 spark / storm / zipkin...等等, 都是clojure或是scala写的,为啥不能用java直接写,我觉得就像许多年前 有人问用c 语言写,为啥不用汇编一样,没啥意思,软件世界的进化ing;storm的作者自己说的clojure写舒服,java会很痛苦。

        在决定专注clojure 一段时间后,突然意识到分布式并发并不是clojure擅长的,scala这个有先天优势,毕竟有akka, 强大的actor。后来在stack overflow上看到有人讨论这个,哎,不得不感叹老外的知识面就是比我们国内广,他们说clojure并发方式很多,很优雅;分布式的并发也有,就是quasar/Pulsar。

quasar/quasar都有actor /   轻型线程 / channel

Lightweight threads, Go-like channels, and Erlang-like actors for Clojure

Pulsar  https://github.com/puniverse/pulsar     clojure版本

quasar  https://github.com/puniverse/quasar   java 版本

这里先概述下 quasar 

1) fiber  轻型线程

2)channels  类似go 语言的channels

3)actor

东西太多了先简单介绍fiber ;

Fibers 是轻量级的thread, 不是操作系统来管理,一个空闲的fiber只占用400 bytes of RAM,你可以创建数百万fiber在一个应用程序(这个太不可思议了)。如果你了解go语言,那么他就和goroutines差不多。

使用场景:
当然fiber并不是要取代thread,而是在使用场景上有区别的;fiber使用的是当一段程序代码需要经常被block,然后等待另外一个 fiber的message(通过管道 channel发送/这里的channel也是借鉴go语言的一个quasar的实现)或是数据流。一个长时间运行的组件而且很少被 block,那么thread就比较适用了。
一个简单的列子
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;

public class FiberDemo1 {
	
	public static  void t1(String ss)
	{
		
		new Fiber<String>() {
			
			private static final long serialVersionUID = 1L;
			@Override
			protected String run() throws SuspendExecution, InterruptedException {
				System.out.println(" in fiber...");
				return "---";
			    }
			}.start();
	}
		
	public static void main(String[] args) {
			t1("in ?");
	}
}


记得需要
执行的时候 加上  
-javaagent:path-to-quasar-jar.jar
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐