处理图片的时候会阻塞服务器,请教下,有什么好的解决方案么?
发布于 7 年前 作者 moshuqi 5080 次浏览 来自 问答

服务器需要将上传收到的几张图片进行裁剪并合成,用了jimp这个库,print绘制文本,和write保存图片到本地比较耗时,这个过程中服务器完全无法响应其他请求。

请教各位前辈,一般这种情况怎么处理好?还是说node服务器本身就不适合用来处理图片?

11 回复

处理图片这种要用到很多压缩算法,而且还占内存,明显不是nodejs擅长的,这种可以放到后台队列中处理 然后前端用ajax请求处理处理,服务器处理完成以后再返回最终图片的url

一般这种情况怎么处理好?

加机器。

write本身应该也是异步的,如果完全无法接受请求可能是用了同步写的方法, 最好贴一贴代码来

你的业务逻辑有问题,应该分开处理,web 服务器只处理入库,通过后台任务去调度执行图片处理,对于用户那边,是他上传完后,不要干等处理,而是等待后台处理完后的消息推送。

@aojiaotage

Jimp.loadFont(p).then(function (font) {
	image.print(font, 5, 5, text);
	image.write(dest);
	console.log('Compose pics finished.');
	cb(null, dest);
	}).catch((err) => {
	console.log(err);
	cb(err);
	});
		
image 是通过 new Jimp 生成的对象,p是字体路径。主要就是 print 和 write 耗时,看了下jimp的接口貌似也没说是异步还是同步,文档示例也是这样用的

@atian25 @yakczh 感谢指点,话说后台任务一般怎么处理好?通过 child process 子进程调用其他可执行文件来专门处理图片可行否?

用golang处理图片吧,好像它带这些库

来自酷炫的 CNodeMD

…imagemagick,用npm包或者是手写脚本spawn, exec

最后参这篇文章来处理了,感谢楼上各位指点!:)

我用gm模块,没有发生你说的事情哎

@moshuqi 处理图片交给其他进程。通信可以基于http,需要对方包装一下对你提供接口。 或者直接node调用系统命令通信也行,http://www.cnblogs.com/zhoujie/p/nodejs2.html

回到顶部