如何在没有 WHILE 循环锁定程序的情况下让 UDP 服务器在 Python 3 中监听?

Posted

技术标签:

【中文标题】如何在没有 WHILE 循环锁定程序的情况下让 UDP 服务器在 Python 3 中监听?【英文标题】:How do I keep a UDP server listening in Python 3 without the WHILE loop locking up the program? 【发布时间】:2020-02-28 02:05:36 【问题描述】:

我能找到的每个 UDP 服务器示例都使用 while True 循环来监听传入数据。我正在尝试使用单个 UDP 套接字服务器作为 kivy 窗口的一部分,该窗口也在做其他事情。一旦我实现了服务器的 while True 循环,一切都会锁定,正如我想我所期望的那样。

如何侦听 UDP 端口并让程序的其余部分继续运行?

我尝试将 UDP 服务器处理移动到另一个 (udp_server.py) 文件,然后导入该函数,但由于我正在导入 while 循环,因此没有任何变化。

我还尝试将接收到的数据分配给 udp_server.py 中的变量,然后只导入该变量,而 udp_server.py 已经单独运行,但即使这样也锁定了我的主程序。

我 99.99% 确信这只是一些我应该已经知道的基本知识,但我是 Python 新手。提前感谢您的帮助。

【问题讨论】:

听起来你需要看看线程或多处理 【参考方案1】:

你能分享你的python文件吗? 这样我就可以理解你是怎么做到的了。

我有一个if __name__ == '__main__': 循环,它监听 g​​pio 的。 我也想从 udp 端口​​获取命令。

谢谢

HW 为 rPi 零

【讨论】:

【参考方案2】:

谢谢你克里斯!!!!!!

我确信我低估了线程的复杂性,但它现在工作得很好,我唯一需要补充的是:

def thread_function():
    from udp_server import amx_rx
    # do stuff with amx_rx...

# class TouchPanel stuff...

if __name__ == '__main__':
    x = threading.Thread(target=thread_function, daemon=True)
    x.start()
    try:
        TouchPanel().run()
    except KeyboardInterrupt:
        raise

现在我有一个正在运行的程序,它在后台侦听一个 UDP 套接字!谢谢!!!

【讨论】:

请注意,多线程代码很难推理,特别是您需要非常小心任何共享的可变状态。 deadlockempire.github.io 解决问题的好游戏 谢谢山姆。我想我可能很幸运,因为它的唯一功能是传入外部字符串。不过,我一定会查看您的链接,因为我想进一步了解。

以上是关于如何在没有 WHILE 循环锁定程序的情况下让 UDP 服务器在 Python 3 中监听?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有测试目标的情况下让 SwiftUI Preview 只构建主要目标?

在多线程应用程序表单上使用while循环锁定c#阻塞单核机器上的所有线程

有没有不使用嵌套while循环来实现这个程序的不同方法? [复制]

如何在没有 while 循环的情况下使用 nanomsg 调查架构?

如何在不冻结 GUI 的情况下让 AudioQueue 播放?

消费者/生产者锁定 GUI 线程