如何在没有 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__':
循环,它监听 gpio 的。
我也想从 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 调查架构?