我目前正在使用第三方API来获取结果,使用REST客户端(Retrofit)。
问题是每秒对API的请求量受到间隔的限制:请求之间间隔为100 ms时,每秒不能执行10次请求。
由于我希望多线程这些调用的性能目的,我想知道如何管理这个间隔100 ms之间的每个API调用?
我不能在一个线程中睡眠100 ms,因为它被限制在当前线程上。
有办法在多个线程之间使用共享睡眠吗?或者你知道如何实现这一点吗?
谢谢。
发布于 2019-11-21 15:15:11
如果我正确理解,您有多个端点和多个用户并发地发出请求。
然后,您希望确保这些请求至少在全球范围内发生。
这是基本的想法:
可以将要执行的请求添加到队列中。更准确地说,是一个ConcurrentLinkedQueue
of Runnable
(您将为每个端点创建自定义运行表)。多个线程可以与此单个队列并发交互。
然后,您可以使用一个Timer
来执行一个命令,该命令从队列中获取一个项并执行它。这样,每个间隔都会发出请求,而不管它们添加到队列的速率如何(当然,除非它是空的)。
如果需要,将Timer
替换为ScheduledThreadPoolExecutor
。
您可以通过停止Timer
(或停止ScheduledFuture
)来改进这一点,如果您处于不活动的※时期。另外,在将项添加到队列时(如果停止),再次启动/调度它。
※:跟踪上次请求的时间。如果您从队列中获取了什么,请将时间更新为当前时间。如果你没有,把时间和现在的时间比较一下.如果太多的时间(对太多的定义来说)已经过去了,那么你就处于一段无所事事的时期。
我不知道你是怎么处理回应的。但是,不管它们是否是同步的,它们都是同步的。您可以选择传递一个自定义Consumer
,在那里可以传递结果。实际上,您的自定义Runnable
(您添加到队列中的那个)可以保存来自客户端的Consumer
。
https://softwareengineering.stackexchange.com/questions/401399
复制相似问题