几种web并行化编程实现

标签: web 并行 编程 | 发表时间:2013-07-07 13:11 | 作者:wzllai
出处:http://blog.csdn.net

    当网站做到一定规模的时候,web单个页面需要涉及到的业务也会越来越多,每个页面可能会向后端发起几个、十几个甚至几十个请求。对于java、python之类的支持多线程的语言可以使用多线程编程,但也会增加程序的复杂性,像php这样的不支持多线程的语言只能借助其他方法实现并行,下面总结几种比较实用的并行化框架。


1、 yar 是鸟哥开发的一个 基于php扩展的RPC框架。

//service.php
class ServiceTest
{
    public function test($param){
        sleep(1);
        return 'sleep 1s';
    }
   public function test2($param){
        sleep(1);
        return 'sleep 1s';
    }

   public function test3($param){
        sleep(1);
        return 'sleep 1s';
    }

}
$service = new Yar_Server(new ServiceTest());
$service->handle();

//client.php
$api    = "http://127.0.0.1/yar/service.php";
$param  = array(1,2,3);
function callback($retval, $callinfo){
    print_r($retval);
}
Yar_Concurrent_Client::call($api, 'test', array($param), 'callback');
Yar_Concurrent_Client::call($api, 'test2', array($param), 'callback');
Yar_Concurrent_Client::call($api, 'test3', array($param), 'callback');
Yar_Concurrent_Client::loop();

上面服务端代码有3个方法都sleep一秒来模拟业务端的处理,通过yar扩展注册服务,client端通过Yar_Concurrent_Client并行请求这个三个方法,最终执行时间是大约是1s。值得一提yar的并行操作是通过libcurl的并行实现的,服务端代码必须能够通过http访问到。对于tpc和unix socket目前只能进行同步请求,如需要并行实现需要自行加入消息队列之内的东西去实现。


2、 APS,是安居客集团以zmq为消息中间件,以事件驱动进行网来请求的一个跨语言的RPC框架,框架中有一个代理(device)监听两个端口或者socket文件,分别监听客户端发来的请求和转发给服务端的多个worker进程,并负责把woker处理的返回的数据转发到客户端。运行github上面用php写的demon代码如下。


3、 Gearman,是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。通过worker向Gearmand守护进程注册工作,客户端通过Gearmand将任务分派到后端的worker进程,具体实现和APS类似。


4、 nodejs,是一个事件驱动的单进程语言,可以通过这种异步编程模式实现对后台业务的并行处理。下面demo是以nodejs为客户端请求php后端的一个耗时3s的方法,一个耗时2s的方法:

var http = require("http");
var url	 = require('url');
var eventProxy =  require('eventproxy');
var handle = {};
handle['/'] = test;


function start(route, handle) {
	function onRequest(request, response) {
		var pathname = url.parse(request.url).pathname;
		route(handle, pathname, response);
	}
	http.createServer(onRequest).listen(8081);
}

function route(handle, pathname, response){
	console.log("route\n");
	if (typeof handle[pathname] === 'function') {
		handle[pathname](response);
	} else {
		console.log(pathname + 'is no fund');
	}
}

function test(response) {
	var ep = new eventProxy();
	
	ep.all('data1', 'data2', function(a, b){
		response.writeHead(200, {"Content-Type": "text/plain"});
		response.write(a);
		response.write(b);
		response.end();
	});


	http.get('http://127.0.0.1/nodejs/service.php?function=test', function(data){
		var buffers = [], size = 0;
		data.on('data', function(buffer) {
			buffers.push(buffer);
			size += buffer.length;
		});
		data.on('end', function(){
     		var buffer = new Buffer(size), pos = 0;
        	for(var i = 0, l = buffers.length; i < l; i++) {
           		buffers[i].copy(buffer, pos);
           		pos += buffers[i].length;
       		 }
			ep.emit('data1', buffer);
		});
	});
	http.get('http://127.0.0.1/nodejs/service.php?function=test2', function(data){
		var buffers = [], size = 0;
		data.on('data', function(buffer) {
			buffers.push(buffer);
			size += buffer.length;
		});
		data.on('end', function(){
     		var buffer = new Buffer(size), pos = 0;
        	for(var i = 0, l = buffers.length; i < l; i++) {
           		buffers[i].copy(buffer, pos);
           		pos += buffers[i].length;
       		 }
			ep.emit('data2', buffer);
		});
	});
}

function sleep(milliSeconds) {
   var startTime = new Date().getTime();
   while (new Date().getTime() < startTime + milliSeconds);
}

start(route, handle);



总结:

上述并行请求的实现有两种方式,一是基于事件驱动模型nodejs、yar(yar底层libcurl的curl_multi应用select()),二是基于消息队列的多进程的任务调度APS、Gearman。在实际的应用中的选择什么样的并行框架可能会根据各个方面来抉择,不管选择哪个,带来的一个很大的好处是使程序SOA化,减小代码间的耦合度,更变方便扩展。

作者:wzllai 发表于2013-7-7 21:11:38 原文链接
阅读:60 评论:0 查看评论

相关 [web 并行 编程] 推荐:

几种web并行化编程实现

- - CSDN博客架构设计推荐文章
    当网站做到一定规模的时候,web单个页面需要涉及到的业务也会越来越多,每个页面可能会向后端发起几个、十几个甚至几十个请求. 对于java、python之类的支持多线程的语言可以使用多线程编程,但也会增加程序的复杂性,像php这样的不支持多线程的语言只能借助其他方法实现并行,下面总结几种比较实用的并行化框架.

[译]所有编程皆为Web编程

- - 呦呦鹿鸣
原文作者:Jeff Atwood. Michael Braude对Web编程大受追捧表达了他的不屑:. 大部分人想去做Web编程的原因是,他们不够聪明,因此也做不了别的事. 他们不懂编译器、并发性、3D或类继承. 他们根本不明白我为什么要使用接口或者抽象类. 他们不理解虚函数、指针、引用、垃圾回收、终结器、传引用与传值的区别、C++的虚拟析构函数、或者C#的结构体与类之间的差别.

从可编程到跨终端的Web

- - 随网之舞
“跨终端的Web”是我为 QConbeijing2013的前端专题定的主题. 我在infoQ中文站发表了 《从可编程到跨终端——QCon北京2013“跨终端的Web”专题出品人专访》中比较详细的解释了为什么,现在转一份过来,欢迎探讨. 同时, 今天在Twitter上发布征集讲师送价值4200元的门票一张的消息,欢迎自荐或推荐.

Table被web编程弃用的原因

- - WebHek
Table要比其它html标记占更多的字节. (延迟下载时间,占用服务器更多的流量资源. Tablle会阻挡浏览器渲染引擎的渲染顺序. (会延迟页面的生成速度,让用户等待更久的时间. Table里显示图片时需要你把单个、有逻辑性的图片切成多个图. (增加设计的复杂度,增加页面加载时间,增加HTTP会话数.

并行编程中的“锁”难题

- Guancheng(冠诚) - 并行实验室 | Parallel Labs
注:本文发表于《程序员》2011年第8期并行编程专栏,略有删改. 在并行程序中,锁的使用会主要会引发两类难题:一类是诸如死锁、活锁等引起的多线程Bug;另一类是由锁竞争引起的性能瓶颈. 本文将介绍并行编程中因为锁引发的这两类难题及其解决方案. 在进行并行编程时,我们常常需要使用锁来保护共享变量,以防止多个线程同时对该变量进行更新时产生数据竞跑(Data Race).

Web编程语言和脚本语言的就业趋势

- Joji - ITeye资讯频道
八月是一个值得关注工作趋势的月份,今天,我们来重点关注web编程语言和脚本语言的就业趋势. 您可能很想知道我所指的“web编程语言和脚本语言”到底是什么. 本文中我列举了Ruby、Python、PHP、JavaScript、Flex 以及 Groovy等编程语言. 我在这里并没有提及Rails,是因为我想尽量将开发框架和开发语言区分开.

谷歌宣布推出新的Web编程语言——Dart

- Johnny - ITeye资讯频道
据著名科技网站ExtremeTech的报道,谷歌编程新语言Dart逐渐浮出水面,它是一种“结构化的Web编程”语言. 早在几天前谷歌就已着手注册了一系列与Dart相关的域名,当时也引发了沸沸扬扬的猜测. 此前,Google还向美国专利与商标局提交了名为“SPOT”的商标注册,也引发了Spot为Google的新的编程语言的猜测.

热点争议:Web设计师需要编程知识吗?

- - Web App Trend
Web设计师是否应该学习编写代码是个充满争议的问题. 通常,在完成了一件网页设计后他们把创建网页代码的繁重工作都留给了程序员们. 这种现象不只出现在网络开发行业,在软件及游戏开发业也是如此.  在本篇文章中,作者 Deepu Balan 和大家分享了一些为什么Web设计师需要学习编写代码的理由,这会使广大的Web设计师们受益匪浅.

采访:关于 Go 语言和《Go Web编程》

- - 开源中国社区最新新闻
最近,在网上出现了一本名为《Go Web编程》的书籍,里面详细地讲述了使用Go语言进行Web编程的各个方面. 很特别的是,这本书是在GitHub上以开源的方式撰写的. 日前,InfoQ采访了这本书的作者谢孟军先生,请他来和大家谈谈Go语言以及他撰写的开源书籍. InfoQ:请您先简单和大家介绍一下自己.

web前端研发工程师编程能力成长之路 [转]

- han - 博客园-首页原创精华区
如果你是刚进入WEB前端研发领域,想试试这潭水有多深,看这篇文章吧;. 如果你是做了两三年WEB产品前端研发,迷茫找不着提高之路,看这篇文章吧;. 如果你是四五年的前端开发高手,没有难题能难得住你的寂寞高手,来看这篇文章吧;. WEB前端研发工程师,在国内是一个朝阳职业,自07-08年正式有这个职业以来,也不过三四年的时间.