我遇到了一个问题,这可能是一种设计Python工作者+ API的方法,它处理从Internet收集的数据,并让其他服务(外部)通过API访问这些数据。 我要告诉你,我没有计算机科学的具体背景,只是进行了大量的试验和错误,这使我得以实现这一目标。
如何避免因为工作人员正在提取数据而导致我的API忙碌? 线程和队列似乎是解决方案,但我在调整我的项目时遇到了问题。 有人可以建议我在这种情况下应该使用哪种方法吗?和可能与此类似的项目?
我已经在Stack上写了一个没有任何答案的问题,在这里你可以找到代码 (my first question + code).
这个问题也可以以不同的比例(更大)构成这个问题 ( multiple workers+Flask APIs )
我也检查了它们:
答案 0 :(得分:1)
使用线程库。保持主线程处于打开状态以处理响应并分离“工作”#39;相互thread.joined()的线程形成一个队列。
您需要向API用户提供作业ID(最好在数据库中的应用程序之外保留这些,以及可能的进度和状态更新信息),然后允许他们查询他们的工作&#39 ; s状态/从另一个端点下载其作业。您可以保留另一个线程队列来处理与收集/下载相关的任何计算密集型。
所有这一切,这一切都可以使用微服务架构来完成,其中您有一个应用程序调度作业,一个应用程序检索/处理数据,以及一个应用程序处理状态/下载请求。这些将通过http接口(restful将是伟大的)和数据库共同持久化数据。
最后一种方法的好处是,每个应用程序都可以在Kubernetes等框架内从可用性和资源角度进行独立扩展。
更新:
只需阅读您的原始帖子,您的主要问题似乎是将数据保存在全局变量中,而不是数据库中。将您的数据保存在数据库中,并通过单独的应用程序或一组预留在当前应用程序中的线程将其提供给客户端。
对OP评论的更新回复:
Stefano,在您描述的用例中,不需要将任何组件相互连接。它们都只需要连接到数据库。
数据收集服务应收集数据,然后将其提交到数据库进行存储,其中"请求数据"组件可以找到并检索它。
如果需要用户输入此流程,那么"提交数据请求"组件应接受该请求,为用户提供id,然后将该作业的需求存储在数据库中以供数据收集器组件发现。然后,您需要一个组件来提供从数据库到用户的作业状态/进度。
你在使用什么数据库?如果它很慢/很忙,您可以扩展它可用的资源(RAM),或者您可以查看从数据收集器批量更新,这可能是不必要的数据库开销的罪魁祸首。您每秒提交多少笔交易?大小是多少?
Ed anche,si sei italiano,poui domandarmi in la lingua tua si sia piu facile communicare questi detagli technichi。