1

我有一个连接,它通过串行端口(是的,串行端口、arduino、rf24 卡等)从自定义网络协议发送和接收数据。

我希望能够执行查询串行端口等待响应数据包的非阻塞代码。我已经知道当我使用无法修改的第 3 方库时可以使用 deferToThread,但事实并非如此,我可以修改代码。我只想知道如何实现自己的非阻塞代码,该代码返回 Deferred 并稍后返回结果。

例如:

  1. 发送 ID 为 1 的数据包并等待具有相同 ID 的 ACK
  2. 当 ID 为 1 的数据包在接收的数据包队列中不可用时继续等待
  3. 如果找到 ID 为 1 的数据包,则返回结果,以便“调用”回调(对冗余感到抱歉)

谢谢!

4

1 回答 1

1

基本思路如下:

id_to_deferred_map = {}
def sendPacket(id, ...):
    ... # write to transport

    d = Deferred()        
    id_to_deferred_map[id] = d
    return d

# In protocol:
def packetReceived(id, ...):
    d = id_to_deferred_map[id]
    del id_to_deferred_map[id]
    d.callback()

这应该给你一个想法。您只需维护状态以记住id' 并将它们映射到Deferred您给出的 '。当您收到一个数据包时,您获取Deferred并使用 触发它.callback()

您必须填写代码来编写数据包,以及解析到达的数据包、获取id和调用packetReceived

于 2013-10-17T19:01:00.230 回答