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

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

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

最佳答案

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

2个月前 评论
52zsj 2个月前
讨论数量: 9

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

2个月前 评论

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

2个月前 评论
52zsj 2个月前

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

2个月前 评论
伽蓝幻梦 (楼主) 2个月前

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

2个月前 评论
一念沧海一念桑田 2个月前

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

2个月前 评论

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

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

解决方法

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

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

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!