如何编写扭曲的非阻塞代码

时间:2013-10-17 15:30:53

标签: multithreading twisted

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

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

例如:

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

1 个答案:

答案 0 :(得分: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