关于workman多线程问题

dgkerry

问题描述

有一个需求,需要设置一个定时任务来获取用户的交易数据(交易数据为第三方接口),由于用户的数量不确定,所以要是一个一个来请求获取并进行处理(提取数据并写入到数据库),这样显得比较漫长。我在想,有没有可以在一个进程下,开启多个线程(或者固定几个线程),这几个线程帮我来完成这堆用户的交易数据处理?

(我有想到过使用parallel来处理,但对于每个用户的交易数据有多有少,导致一次外部请求获取不完,要多次请求这种情形,用这个处理不合适)

292 4 0
4个回答

timeless-zyg

简单点:
定时任务直接查出需要获取用户交易数据的用户数量
然后按照这个数量拆分投递到队列中
比如10000个用户,队列开了十个进程
那就每个队列投递1000的用户

  • 暂无评论
kof21411

用队列可以解决问题,把进程开多点就可以

  • 暂无评论
rbb

1.消息队列,就像楼上说的
2.你想要固定的,无非就是开启N个定时进程。每个进程查询用户范围不一样。比如有8个定时进程,userTask1-userTask8,这些进程要手动设置好就行了

  • dgkerry 11天前

    第二点可以,但有一个问题,每个进程查询用户范围不一样,本来我打算根据进程id来判断(比如创建10个进程
    'task'=>[
    'handler' => Task::class,
    'eventLoop' => Workerman\Events\Swoole::class,
    'count' => 10,
    ],

    通过进程id%10的余数来查询指定用户),但我在onWorkerStart输出\Webman\App::worker()->id却报错,所以想不到还有什么办法来做到每个进程查询用户范围不一样

  • rbb 10天前
    public function onWorkerStart($connection)
    {
        print_r($worker_id = $connection->id);
    }
jack10082009

上消息队列。那现在问题就变成消费者数量的问题了。你可以单独搞一个消费者控制线程,动态控制消费者数量。

  • 暂无评论
🔝