我已经看到了其中一些问题,但还没有找到真正的答案。
我有一个启动 gstreamer 管道的应用程序,然后监听它发回的数据。
在我基于我的示例应用程序中,它以这段代码结束:
gtk.main()
没有 gtk 窗口,但这段代码确实导致它继续运行。没有它,程序就会退出。
现在,我已经阅读了有关使用while True:
的构造,但它们包含sleep
命令,如果我没记错的话,这将导致我的应用程序在睡眠期间冻结,所以......
有没有更好的方法,不使用 gtk.main()?
我已经看到了其中一些问题,但还没有找到真正的答案。
我有一个启动 gstreamer 管道的应用程序,然后监听它发回的数据。
在我基于我的示例应用程序中,它以这段代码结束:
gtk.main()
没有 gtk 窗口,但这段代码确实导致它继续运行。没有它,程序就会退出。
现在,我已经阅读了有关使用while True:
的构造,但它们包含sleep
命令,如果我没记错的话,这将导致我的应用程序在睡眠期间冻结,所以......
有没有更好的方法,不使用 gtk.main()?
gtk.main()
运行一个事件循环。它不会退出,也不会只是冻结什么都不做,因为它里面有这样的代码:
while True:
timeout = timers.earliest() - datetime.now()
try:
message = wait_for_next_gui_message(timeout)
except TimeoutError:
handle_any_expired_timers()
else:
handle_message(message)
该wait_for_next_gui_message
函数是围绕不同平台特定函数的包装器,这些函数等待 X11、WindowServer、Windows 中的未命名事物等传递诸如“用户单击您的按钮”或“用户按下 ctrl-Q”之类的消息。
如果你在 a ,等上调用http.serve_forever()
或类似的东西,它做的事情完全一样,除了它是一个函数,它包装了类似的东西,你的所有套接字的列表在哪里。twisted
HTTPServer
wait_for_next_network_message(sources, timeout)
select.select
sources
如果你在一个 gstreamer 管道上收听,你sources
可以只是那个管道,而wait_for_next
函数只是select.select
.
或者,当然,您可以使用像twisted
.
但是,您不需要以这种方式设计您的应用程序。如果您不需要等待多个来源,则可以阻止:
while True:
data = pipe.read()
handle_data(data)
只要确保管道没有设置为非阻塞。如果您不确定,您可以setblocking
在套接字、fcntl
Unix 管道上使用,或者在 Windows 管道上使用我想不起来的东西来确定。
事实上,即使您需要等待多个来源,您也可以通过将每个来源的阻塞循环放入单独的线程(或进程)中来做到这一点。这不适用于数千个套接字(尽管在这种情况下您可以使用 greenlets 而不是线程),但对于 3 个或 30 个都可以。
我已经成为 Cmd 类的粉丝。它为您的程序提供一个 shell 提示符,并在等待输入时停留在循环中。这是文档的链接。它可能会做你想做的事。