Python 最合适的节点服务器通信设计

Python 最合适的节点服务器通信设计,python,oop,asynchronous,concurrency,parallel-processing,Python,Oop,Asynchronous,Concurrency,Parallel Processing,我努力设计我项目的一部分。 其思想是,N个节点(每个节点有一个摄像头)将连续地向服务器发送帧以进行对象检测,然后服务器将向每个节点重新发送带有一些信息的响应 目标是尽可能独立地处理每个节点,并能够同时接收下一帧和处理上一帧 在Python中,并行运行的线程不在选项中,我正在考虑几种方法(假设我有一个能够并行处理N*2个线程的CPU: 1) 服务器将为每个节点生成两个进程(相互通信)(一个用于接收帧,一个用于对象检测)。(这些进程将独立于主进程运行) 2) 服务器将是单线程和异步的。每个接收到的帧

我努力设计我项目的一部分。 其思想是,N个节点(每个节点有一个摄像头)将连续地向服务器发送帧以进行对象检测,然后服务器将向每个节点重新发送带有一些信息的响应

目标是尽可能独立地处理每个节点,并能够同时接收下一帧和处理上一帧

在Python中,并行运行的线程不在选项中,我正在考虑几种方法(假设我有一个能够并行处理N*2个线程的CPU:

1) 服务器将为每个节点生成两个进程(相互通信)(一个用于接收帧,一个用于对象检测)。(这些进程将独立于主进程运行)

2) 服务器将是单线程和异步的。每个接收到的帧都将提交给进程池进行检测

3) 服务器将为每个节点生成一个线程(一个线程将处理从一个节点接收帧)。每个接收到的帧都将被提交到一个进程池中进行对象检测

4) 服务器将为每个节点生成一个线程,并在该线程中生成两个单独的线程,一个用于接收,一个用于对象检测


哪种方法似乎最有意义?你能提出一些不同的建议吗?

我喜欢建筑类的问题,如果我必须做这个项目,我会怎么做。
工作流:

  • 节点将向服务器发送请求,包括帧和节点 身份证
  • 基于节点ID和帧,服务器将使用redis内存存储在队列中创建作业,以跟踪节点发送的作业,并将每个请求存储到数据库中
  • 服务器将通过在服务器上运行worker来处理每个作业,worker将从redis队列中获取和处理每个作业
  • 更新作业记录:完成后,作业将标记为已完成,并保存结果
  • 节点可以调用服务器以获取节点发布的每个作业的状态
  • 您需要在服务器上创建RESTAPI接口,以从节点发布作业,并将该请求保存到DB,并基于该请求创建作业,同时将其推送到redis队列。工人将自动从redis队列中取出作业,并根据处理结果更新DB记录

    您需要在服务器端执行以下操作:
    -RESTAPI
    -Redis队列(RQ)
    -数据库服务器

    使用此体系结构,您可以轻松地将轻量级结果立即返回给客户机,并使所有作业处于处理状态。RESTful体系结构是一种广泛使用的体系结构,但对于耗时的作业,我们使用队列处理器,客户机将向我们发出请求,以检查发布到服务器的任何作业的状态。如果你需要,我可以画包括更多细节的架构


    简而言之:如果您有客户机-服务器体系结构,则使用REST API进行通信,并在内存队列存储中发布每个请求,前提是客户机发布的请求是一个耗时的过程,并且需要执行多步作业。使用此体系结构,您可以发布任意数量的作业以及多个工人,负载平衡器以提高性能。

    查看您详尽的答案,我很容易不同意您喜欢体系结构问题。非常感谢,我需要阅读更多关于Redis(到目前为止,我认为它只是一个典型的数据库)和RESTAPI的信息。我目前的理解如下:通过这种方法,我可能不需要在每个节点和服务器之间建立开放式连接,但每个节点可能会提交请求,然后询问结果或作业状态。我主要担心的是,提交作业后,节点可能会重复向服务器发送调用(有一段等待时间(T))介于两者之间),直到它响应任务完成,但我实际上希望服务器尽快重新发送响应,这就是为什么我仍然认为某种异步方法在这种情况下可能更好。(因为如果作业花费了(T+1)时间,那么节点可能会在(T)时间后开始接收它,因为(T)之后它还没有准备好)无需,服务器可以将所有作业放入队列中,逐个处理,并在数据库中更新作业的状态和结果。如果要将通知推送到节点,请使用web套接字或推送器。