CNode

处理图片的时候会阻塞服务器,请教下,有什么好的解决方案么?

问答
Mmoshuqi发布于8 年前最后回复8 年前11 回复5671 浏览0 收藏

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

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

查看回复

回复 (11)

Y
yakczh#1·8 年前

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

Y
yszou#2·8 年前

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

加机器。

A
aojiaotage#3·8 年前

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

A
atian25#4·8 年前

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

M
moshuqi#5·8 年前
引用 aojiaotagewrite本身应该也是异步的,如果完全无法接受请求可能是用了同步写的方法, 最好贴一贴代码来

@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的接口貌似也没说是异步还是同步,文档示例也是这样用的
		
M
moshuqi#6·8 年前

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

Z
zswnew#7·8 年前

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

来自酷炫的 CNodeMD

L
lzszone#8·8 年前

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

M
moshuqi#9·8 年前

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

N
nnliang#10·8 年前

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

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

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

参与回复
登录后即可参与回复。登录