问大家个go多线程的问题,我有一个php的脚本,如果拿go重写,速度会变快么

是这样的,我现在有一批数据需要请求接口去校验结果,顺便把结果保存,用 php 脚本就是先取库,获取待校验数据,然后循环去请求接口去取结果,因为接口比较慢,甚至有些需要反复重试,平均一组数据要 10s 左右。

然后要处理的数据有几万组,目前的脚本就是按 id 一个个去执行。速度很慢,想着有没有办法快一些处理,比如 go 的 channel ,之前写过一点点 go,现在忘的差不多了,如果用 go 该如何处理,怎么解决不同线程会读同组数据问题

最佳答案

从你的描述上,可以快一些,但是有限。因为你的校验接口本身慢。多个跑无非并发调用,如果那边承受不了的话,也不一定能提升多少。数组重复问题,你可以用队列。如果是 go 的话,用 channel 或 切片 + lock 维护就好,php 的话借助 redis,多开几个脚本也可以

1年前 评论
52zsj 1年前
讨论数量: 9

先获取几组数据,然后开 goroutine,理论上会快很多

1年前 评论

从你的描述上,可以快一些,但是有限。因为你的校验接口本身慢。多个跑无非并发调用,如果那边承受不了的话,也不一定能提升多少。数组重复问题,你可以用队列。如果是 go 的话,用 channel 或 切片 + lock 维护就好,php 的话借助 redis,多开几个脚本也可以

1年前 评论
52zsj 1年前

先要解决接口慢的问题,要 php 背锅有点草率。

1年前 评论
伽蓝幻梦 (楼主) 1年前

用多线程、携程、服务消费 这几种方式都可以,不限语言

1年前 评论

php 的逻辑是你一次发一个请求到验证接口,验证接口 10s 中处理完后返回结果给你。go 的逻辑是 你一次发生 10 个请求到接口,接口 60s 后返回结果给你,这么看没什么提升,该提升的是你的接口问题。你这里一次发一个请求和一次发 10 个请求没区别,门被堵死了。

1年前 评论

看起来两个要解决的问题:

  1. 数据组的消费速率
  2. 数据组的重复消费

解决方法

  1. 利用 channel 作为消息队列,起一个 goroutine 用来生产数据,写入 channel。(同一个 channel 可以解决消费重复)
  2. 另外可以启用多个 goroutine 同时监听该 channel,多个 goroutine 并发消费,且不会重复消费。 至于性能,比单线程是要快,但是多半还是要看接口的性能问题

接口性能不高,且还会有反复重试的情况,实际操作还需要考虑阻塞等各种问题。 总结:瓶颈在上行服务的性能。就像生产消费,消费能力不行,生产再多,也只能堆积在库存中

1年前 评论