【问题标题】:How to write non-blocking code for twisted如何为twisted编写非阻塞代码
【发布时间】:2013-10-17 15:30:53
【问题描述】:

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

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

例如:

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

谢谢!

【问题讨论】:

    标签: multithreading twisted


    【解决方案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

    【讨论】:

    • 很好的答案——也许还值得举一个在 Twisted 中使用串行端口传输的例子。
    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多