同时在Python Web服务中接收和处理大量数据

时间:2019-02-07 22:21:52

标签: python web-services asynchronous

我正在这里对我的问题进行更简洁的阐述。被标记为范围太广。

我正在寻找一种本机python或框架的方法,它将允许我执行以下操作:

  • 发布一个网络服务,最终客户可以像其他任何标准网络服务一样调用该网络服务(使用curl,邮递员,请求等)
    • 此网络服务每次调用将接受千兆字节(也许10s GB)的数据
  • 正在传输这些数据时,我想将其分成多个块,并分离出单独的线程和/或进程以同时使用它(我的处理很复杂,但是每个块都是独立且独立的)
    • 这样做可以使我的逻辑与通过Internet上传的数据并行运行,并避免在传输数据时浪费所有时间
    • 这还可以防止在我的逻辑开始之前就将10 GB的千兆字节全部放入RAM。

原始问题:

我正在尝试构建一个Web服务(使用Python),该服务可以接受潜在的数十GB数据并处理该数据。我不希望在传递给我的逻辑之前将其完全接收并内置到内存中的对象中,因为a)这将占用大量内存,b)处理速度会很慢,我很想拥有处理线程,同时异步接收其余数据的处理线程。

我认为我需要某种流解决方案,但是我很难找到任何Python解决方案来处理这种情况。我发现的大多数事情都是关于流输出的(对我来说这不是问题)。同样,wsgi似乎在设计数据流解决方案时遇到了问题。

我缺少针对此类问题的最佳实践吗?和/或,有没有我找不到的解决方案?

编辑:由于有几个人问,这是我要查看的那种数据的示例。基本上,我正在使用句子列表,该列表可能长达数百万个句子。但是每个句子(或一组句子,为了简便)都是一个单独的处理任务。最初我计划将其作为json数组接收,例如:

{"sentences: [
    "here's a sentence",
    "here's another sentence",
    "I'm also a sentence"
    ]
}

对于此修改,我认为这只是换行符分隔的句子,因为我真的不需要json结构。所以在我的脑海里,我的解决方案是;我得到了恒定的字符流,每当我获得换行符时,我都会拆分前一句话,并将其传递给工作线程或线程池进行处理。我也可以分成很多句子来避免一次执行大量线程。但是最主要的是,当主线程获取此字符流时,它会定期拆分任务,以便其他线程可以开始处理。

第二次编辑:我对如何处理数据有一些想法。我不能提供大量的具体细节,因为它们是专有的,但是我可以将句子输入到ElasticSearch或其他数据库中时存储它们,并让异步过程处理这些数据,或者(理想情况下)我会工作句子(分批)存储在内存中。顺序很重要,而且不丢任何句子也很重要。尽管输入将来自互联网上的客户,所以这就是为什么我要避免像流程这样的消息队列,所以每个句子都没有新呼叫的开销。

理想情况下,Web服务的客户不需要做任何特别的事情,除了通过庞大的主体执行常规的POST请求外,所有这些特殊逻辑都是在服务器端进行的。我的客户不会是专业的软件工程师,因此尽管Web服务呼叫完全在他们的操盘手之内,但我不想强加给他们处理更复杂的消息队列过程或类似的事情。

1 个答案:

答案 0 :(得分:2)

除非您共享更多的数据类型,处理或问题所具有的其他限制,否则要提供更多量身定制的建议比向您提供一些资源要困难得多。

...这是我的尝试,希望对您有所帮助!

似乎您需要的是以下内容:

  • 消息传递系统流系统,以便传递/接收数据
  • (可选)异步任务队列,以对数据启动不同的处理任务
  • 甚至是自定义数据处理管道系统

消息传递与流媒体

示例:RabbitMQKombu(根据@abolotnov的评论),Apache Kafka(和python ports),Faust

消息传递和流传输之间的主要区别可能随系统/定义/您要求的人而异,但是通常:
 -消息:一个“简单”的系统,将负责在两个进程之间发送/接收单个消息
 -添加了诸如“重播”,发送多组消息的迷你批处理,处理滚动窗口等功能的功能。

消息系统也可以实现广播(向所有接收者发送消息)和发布/订阅方案,如果您不希望 >发布者(数据创建者)来跟踪将数据发送给谁(订户)的人,或者您的订阅者也可以跟踪谁以及何时去获取数据。


异步任务队列

示例:CeleryRQTaskmaster

这基本上可以帮助您分配一组任务,这些任务可能是您打算执行的主要处理的较小块,然后确保每当新数据弹出时,这些任务就可以执行。


自定义数据处理系统

我主要想到的是:Daskofficial tutorial repo

这是一个非常适合您所拥有的系统的系统。基本上,某些来源(可能会完全控制或无法完全控制)中产生的大量信息需要经过一组处理步骤才能被其他过程(或存储)消耗。

Dask是前一种的组合,您可以定义一个计算图(或 task graph ),其中包含数据源和连接的计算节点,其中一些可能依赖于其他节点。以后,根据部署它的系统,可以为同步或不同类型的异步指定将要在其中执行任务的方式,但要将此运行时实现详细信息与要执行的实际任务分开。这意味着,您可以在计算机上进行部署,但是稍后决定在群集上部署相同的管道,并且只需要更改此运行时实现的“设置”即可。

Dask system

此外,Dask基本上模仿了numpy / pandas / pyspark或您可能已经在使用的任何数据处理框架,因此语法(几乎在每种情况下)几乎相同。