用Python产生的工人

时间:2019-05-05 17:38:12

标签: python multithreading multiprocessing python-asyncio

我正在编写一段代码,该代码将能够击中多个Web API(具有告知机器状态的API的硬件),当一个人在等待另一个人等待响应时,它不会阻塞一到达,它将被发送到websocket。一个要求是不要杀死API,因此只要主进程正在运行,就每5秒命中一次。

我一直在努力的重要部分是如何做到这一点。 至此,我所做的是,主要过程是为不同的API生成单独的线程,并且该线程正在访问API,从而向websocket time.sleep(5)发送响应并重复执行。主要过程负责启动新的“工人”并杀死不再需要的工人,并负责重新启动本应工作但不是由于异常而产生的工人。 我不知道多线程是否可以解决问题-假设我打算通过300个API进行“爬网”。

产卵长寿的工人是实现这一目标的正确方法吗?这些应该是流程吗?我是否应该让主要进程协调执行短命线程,这些短命线程将执行API调用并终止,并且每个API每5秒执行一次(这似乎维护起来更糟)?如果是最后一个选择,那么如何处理响应需要5秒钟以上才能到达的情况?

现在有人在谈论Python的异步,就像它是所有问题的黄金解决方案,但我不知道它如何适合我的问题。

有人可以指引我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

让我改一下,然后告诉我我是否正确:

  

我想经常访问约300个API,以便每个API大约每5秒被命中一次。我该如何处理?应该使用哪种工作人员/流程管理?

基本上有两种不同的方法:

  1. 为当前正在监视的每个API都拥有一个线程(即,经常被触摸)-仅在任何给定时间仅监视您可能的API总数中的一部分时才可行。 / li>
  2. 设置一个工作池,所有工作人员都使用相同的队列,并有一个管理进程根据时间限制填充队列-当您始终希望监视所有可能的API时,可能会更好。

在您的第一个评论后编辑:

您知道要监视的API的数量,因此队列的长度绝不能超过该数量。另外,您可以经常扫描主进程中的队列,并检查您要添加的API地址是否已在其中,并且无需再次添加。

为避免过于频繁地访问API,您可以将目标时间戳和API地址一起添加到队列(例如,作为一个元组),并让工作人员等到到达该时间后,再向该API发出查询。这将减慢整个队列的消耗,但将在两次点击之间保持最小的延迟。如果选择这样做,则只需确保(a)API请求始终在合理的时间内响应,并且(b)将所有API地址以循环方式添加到队列中。