Multithreading 如何为twisted编写非阻塞代码

Multithreading 如何为twisted编写非阻塞代码,multithreading,twisted,Multithreading,Twisted,我有一个通过串口(是的,串口、arduino、rf24卡等)从自定义网络协议发送和接收数据的连接 我希望能够执行非阻塞代码,查询等待响应数据包的串行端口。 我已经知道,当我使用第三方库时,我可以使用deferToThread,但我不能修改,但事实并非如此,我可以修改代码。我只是想知道如何实现自己的非阻塞代码,该代码返回一个延迟值,稍后返回结果 例如: 发送ID为1的数据包并等待ID相同的ACK 在接收到的数据包队列中ID为1的数据包不可用时保持等待 如果找到ID为1的数据包,则返回结果,以便“调

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

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

例如:

  • 发送ID为1的数据包并等待ID相同的ACK
  • 在接收到的数据包队列中ID为1的数据包不可用时保持等待
  • 如果找到ID为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
    ,并将它们映射到您发出的
    延迟的
    。当您收到一个数据包后,您将获取延迟的
    并使用
    .callback()
    触发它


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

    基本思想如下:

    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
    ,并将它们映射到您发出的
    延迟的
    。当您收到一个数据包后,您将获取延迟的
    并使用
    .callback()
    触发它


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

    好答案-也许还值得给出一个在Twisted中使用串行端口传输的示例。好答案-也许还值得给出一个在Twisted中使用串行端口传输的示例。