每分钟调用同一个API超过2000次(JSON/PYTHON),使用(HTTP sync,HTTP async,WebSocket,or Other)?

9w11ddsr  于 2023-06-06  发布在  Python
关注(0)|答案(2)|浏览(354)

我正试图从金融机构API收集2000多只股票的1分钟数据,只要数据可用,每分钟一次。我想在交易时间收集数据。我想用Python来收集这些数据。
示例API URL [Not a valid URL]:https://api.finance.com/v1/marketdata/[STOCK]/1minute
条件:
1.我们知道,所有2000+股票1分钟数据可用于检索,一旦分钟命中。* 例如,如果当前时间是10:02:00 AM,我想从GOOG获取10:01:00 AM的数据,我会调用URL:https://api.finance.com/v1/marketdata/GOOG/1minute,我会看到10:01:00 AM的数据。
1.数据以JSON格式存储。
1.存在限制。假设请求之间的等待时间为500毫秒。
1.我需要一分钟的数据滴答数据(即开、低、高、闭)。

问题:如何在30秒内收集所有2000多个股票数据?

我提出的解决方案,虽然我不知道它在这种情况下是否是最佳的,或者我对HTTP请求,HTTP异步,WebSocket的理解在某种程度上是缺乏的。
可能的解决方案?:
1.使用For循环的HTTP请求:目前我使用的是一个简单的for循环和time.sleep()函数。这是最容易实现的。但它的问题是,由于节流限制,它最多需要16分钟。

  1. HTTP异步:据我所知,我可以为每只股票创建一个单独的线程,并以这种方式收集一分钟的数据。但是根据我所读到的,我最多可能有大约100个线程同时运行。这是一个正确的假设吗?而且,大多数服务器不允许从一台客户机同时发出这么多请求吗?
  2. WebSocket:据我所知,我可以简单地创建一个与服务器的连接并获取数据,而不必担心节流限制。理想情况下,我会使用WebSocket构建应用程序。假设这是解决这类问题的最佳方法,这是正确的吗?然而,我目前使用此方法的问题是,它们的1滴答分钟数据只能通过此API URL调用方法获得。据我所知,我不能通过WebSocket连接(即如果我连接到他们的WebSocket url:wss://stream-finance.com/ws,1分钟的数据不是另一端的可用数据之一)我这里的问题是:是否可以使用https url创建WebSocket连接?另外,如果1分钟的数据不是可用的选项之一,是否可以通过他们的WebSocket url wss://stream-finance.com/ws检索1分钟的数据?
  3. Other:他们的另一种方法是否更适合这个示例?
    最佳解决方案?:我看到的最好的解决方案是简单地创建一个单一的连接到他们的服务器,然后调用每个股票更新每1分钟“实时”。但我不知道如何通过他们提供的HTTPS URL实现这一点。

9nvpjoqh

9nvpjoqh1#

你的问题有点令人困惑。让我们在这里分开一些问题。

服务器端

通信协议的选择完全取决于服务器端实现的内容,您只需相应地开发客户端即可。
Bellow是我见过的一组选项和技术:

*HTTP Pooling(我喜欢称之为hit and run技术)只需在间隔的基础上向感兴趣的端点发送HTTP请求;每一分钟似乎都是你的用例。这将得到几乎所有HTTP API的支持。
*HTTP Long Pooling类似于池化,支持Long Pooling的服务器会挂起HTTP连接,直到有合适的数据提供或超时。从客户端的Angular 来看,您仍然在以间隔为基础不断地请求数据,只是服务器推迟响应,直到数据可用。
*Web sockets(非常适合您的情况)这本质上是两种技术的结合(这里过于简单),服务器将在保持连接的同时进行响应,并通过它不断发送新数据。

客户端

无论您决定使用哪种协议,您的客户端软件都必须以某种方式处理网络延迟。
为了简单起见,我假设您有一个名为get_data()的函数,它使用上述技术之一从服务器获取数据。

*同步您的客户端将调用get_data(),处理响应,然后重复。你已经习惯了,这就是Python通常的工作方式。
*Asynchronous您的客户端会将对get_data()的调用分派给某个worker,当数据进来时,会执行其他一些函数。本质上允许您的程序执行多个API调用,并以响应顺序而不是请求顺序处理它们。
*线程类似于同步行为,您将在单独的CPU线程中处理每个请求/响应,并在数据传入时进行处理。(包含Python's GIL的所有警告)

注意事项

很明显,2000多个线程并不是一个好的解决方案。

c9qzyr3d

c9qzyr3d2#

您将在服务器端受到限制。
要在这个时间段内获得这么多数据,你必须支付大笔巴克斯。

相关问题