【发布时间】:2017-07-28 13:22:18
【问题描述】:
我正在通过 UDP 从微控制器获取数据。每个数据包都是一个十六进制字符串,我需要将它分成大小相等的块,然后再进行一些处理。但是,由于数据包相对较大(每个大约 700 个字符),因此将一个数据包分成块所需的时间大于数据包到达之间的时间。这会引入延迟,并且一半的数据会丢失。我不能使用 TCP/IP,因为系统需要实时运行。如何多处理以下行(甚至可以完成):
list_of_chunks = [packet[i:i+n] for i in range(0, len(packet), 16)]
【问题讨论】:
-
多处理不太可能解决您的问题。如果拆分一个短字符串(700 个字符很短)需要在数据包之间完成太多时间,那么进程间通信的开销可能也会太高。我宁愿建议切换到更高效的实现(Cython?)甚至更高效的语言(C?)。
-
我猜队列系统可能会满足您的要求。也许您可以对数据包进行排队并使用多线程消费者模式来处理它们。可能是 celery 是您正在寻找的。但不确定,我不知道你在哪里说实时你在谈论对某个地方的快速回复。
-
对匆忙的开发人员的简单扩展技巧:运行 N 个 Python 服务器副本,侦听端口 P..P+N-1。让您的 MCU 循环顺序发送到端口 P..P+N-1。仅当您的数据包处理顺序无关紧要时才有效。
-
你给了我一些想法,我会试试的,谢谢。
-
您需要随机访问
list_of_chunks中的项目吗?可以编写一些东西,根据需要一次一个地顺序生成它们,或者快速为您提供列表中的任何单个元素而无需实际创建它(列表)。因此有效地生成所需的块,但仅在需要每个块时)。最后,由于数据是十六进制的,您可以通过尽快将其转换为二进制来将其大小减半。
标签: python split multiprocessing chunks