我正在编写一段代码,该代码将能够击中多个Web API(具有告知机器状态的API的硬件),当一个人在等待另一个人等待响应时,它不会阻塞一到达,它将被发送到websocket。一个要求是不要杀死API,因此只要主进程正在运行,就每5秒命中一次。
我一直在努力的重要部分是如何做到这一点。
至此,我所做的是,主要过程是为不同的API生成单独的线程,并且该线程正在访问API,从而向websocket time.sleep(5)
发送响应并重复执行。主要过程负责启动新的“工人”并杀死不再需要的工人,并负责重新启动本应工作但不是由于异常而产生的工人。
我不知道多线程是否可以解决问题-假设我打算通过300个API进行“爬网”。
产卵长寿的工人是实现这一目标的正确方法吗?这些应该是流程吗?我是否应该让主要进程协调执行短命线程,这些短命线程将执行API调用并终止,并且每个API每5秒执行一次(这似乎维护起来更糟)?如果是最后一个选择,那么如何处理响应需要5秒钟以上才能到达的情况?
现在有人在谈论Python的异步,就像它是所有问题的黄金解决方案,但我不知道它如何适合我的问题。
有人可以指引我正确的方向吗?
答案 0 :(得分:2)
让我改一下,然后告诉我我是否正确:
我想经常访问约300个API,以便每个API大约每5秒被命中一次。我该如何处理?应该使用哪种工作人员/流程管理?
基本上有两种不同的方法:
您知道要监视的API的数量,因此队列的长度绝不能超过该数量。另外,您可以经常扫描主进程中的队列,并检查您要添加的API地址是否已在其中,并且无需再次添加。
为避免过于频繁地访问API,您可以将目标时间戳和API地址一起添加到队列(例如,作为一个元组),并让工作人员等到到达该时间后,再向该API发出查询。这将减慢整个队列的消耗,但将在两次点击之间保持最小的延迟。如果选择这样做,则只需确保(a)API请求始终在合理的时间内响应,并且(b)将所有API地址以循环方式添加到队列中。