关于-webman,异步任务

evilk

1.在swoole中,如果处理耗时等类似业务,可以将任务放入队列或者扔给taskWorker执行
2.在webman中,如果想执行类似业务,应该如何操作呢?
3.如果交给自定义进程,应该如何操作呢?
4.另外,关于自定义进程,监听和非监听,在应用上,有什么区别吗,比如应用场景?

5097 5 5
5个回答

walkor

webman 提供了redis队列,可以处理异步任务。https://www.workerman.net/doc/webman#/queue/redis

任务交给自定义进程可以参考这个 https://wenda.workerman.net/question/6057

自定义进程监听和非监听区别就是字面意思,一个带监听,一个不带。当进程不需要外部主动传递信息时,可以不用监听,比如一些定时任务。

yzh52521

我在webman 使用的 workerman的异步任务
http://doc.workerman.net/faq/async-task.html

  • evilk 2021-05-30

    这里想请教一下,向任务进程投递任务,如果任务需要5秒才能返回,这5秒内,当前进程会阻塞等待吗?

yedemon

workor大·· webman里面如果想用 您的异步http client。实现一个类似代理那样的功能,但是controller里面不是需要同步返回一个Response麽? 这个有什么好办法麽?

  • li914 2022-04-29

    可以做个中间件,在中间件中做个判断是否是 Response 如何不是就加个 Response 返回

  • yedemon 2022-05-10

    不是非常明白`` 希望能给出一些代码, 感谢=ω= 我目前能想到的,只有把 App.php 的 getCallback 改一改了,因为那边就是同步的调用.

  • walkor 2022-05-10

    这个目前没有办法做到。

chaz6chez

这里可以推荐一下你去看一下I/O模型,通常来说有blocking IO、async IO、non-blocking IO;
粗俗的讲

  • BIO就是我们常用的阻塞写法,每一行都需要等待结果然后进行下一步;
  • AIO是大部分做非阻塞的解决方案,一般来说就是开一个线程or进程,整体的调度交给系统,比如使用消息队列,或者开设线程池;
  • NIO的话像Reactor/multi-Reactor模型就是这样的一种模式,使用event-loop无阻塞的进行处理业务;workerman可以实现这样的模式,比如 https://github.com/walkor/rabbitmq ;这里面的rabbitmq客户端是基于bunny实现的,bunny原本使用的是ReactPHP的事件接口,但实际上底层也是基于libevent or libuv or libev等;那么将触发的事件丢入event-loop等待调度,就可以达到异步的效果。

这里面的taskWoker在我理解,实际上和消息队列或者自定义进程没有区别,使用的还是AIO的思想。

这里您指的耗时任务还需要明确一个点,就是当前进程是否在意其执行结果,是否需要等待收集,如果需要阻塞等待收集其结果,最简单的办法就是循环监听,直到收集到且跳出循环,并返回;这一点实际上和golang和swoole的协程的waitGroup是一个道理;进程间可以结合信号量监听pipe/file等、线程间可以监听channel/竞态的内存。

如果不在意其执行结果,或者不需要等待收集的话,市面上成熟的任务调度系统或者消息队列是比较推荐的,自行实现自定义进程通过rpc通讯也是可以的,使用成熟产品可以降低业务开发的心智负担。

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