请问webman运行阻塞耗时任务时如何优雅的处理呢(类似协程)

深林孤鹰

问题描述

这里的阻塞任务主要指io,看了官方文档,walkor老大的意思是多设置点进程,但是感觉和协程比起来还是差点意思,又在问答里搜了很多,也有人说放在队列用业务进程来执行,但这样会产生个问题,就是如何给客户端通知呢?

为此搜索到了哪些方案及不适用的原因

链接进程肯定是将任务放在队列(我用redis~)然后直接返回客户端的,然后处理队列中任务的进程如何给那个客户端通知呢?我想了很久,想到的结果:
1、客户端轮询,效率也是很低的。。
2、客户端和服务端新发起websocket或socket-io之类的新链接等待服务器返回结果,但如何实现和进程间通知任务结果呢?这样的效率又如何呢?

谢谢各位大神来帮忙答疑解惑~

1201 1 3
1个回答

walkor

慢任务建议用消息队列处理,然后利用webman/push给客户端推送。

  • 深林孤鹰 2023-02-26

    嗯,我的思路就是:
    1、客户端访问webman服务,webman服务生成一个任务key返回给客户端,并放入redis;
    2、客户端用这个key长链接(使用websocket或sse)另一个workerman长链接进程,workerman把key传给另外一些业务worker运行;
    3、业务worker运行完毕后,通过tcp把结果传给workerman长连接进程,然后workerman长连接进程再返回给客户端,关闭链接;
    不知这样做对不对,或者老大有更好的方案吗?谢谢~

  • walkor 2023-02-26

    如果不使用队列,可以通过开一组新的http端口来处理慢业务
    https://www.workerman.net/doc/webman/others/task.html#%E6%96%B0%E5%A2%9EHTTP%E7%AB%AF%E5%8F%A3

  • 深林孤鹰 2023-02-26

    谢谢老大,我再好好研究研究~

年代过于久远,无法发表回答
🔝