2013-02-15 50 views
0

我已经看到了其中的一些问题,但还没有找到真正的答案。不要退出python程序,而是继续运行

我有一个应用程序启动gstreamer管道,然后监听它发回的数据。

在我矿根据一个示例应用程序,它与这段代码结尾:

gtk.main() 

没有GTK窗口,但这段代码确实导致其继续运行。没有它,程序退出。

现在,我已阅读有关使用while True:结构,但它们包括sleep命令,如果我没有记错,这将导致我的申请在休眠所以时间冻结...

是有没有更好的方法,而不使用gtk.main()?

+4

请详细说明你的要求...告诉我们你想要达到的目标,而不是你想要达到的目标。 – ajon 2013-02-15 22:00:45

+0

'gtk.main()'有什么问题? – sth 2013-02-15 22:05:37

回答

1

我已经成为Cmd类的粉丝。它为你的程序提供了一个shell提示符,并在等待输入时保持在循环中。这是link to the docs。它可能会做你想做的事。

+0

我总是忘记'cmd',直到我自己构建了70%(大约每年或两年一次)之后,所以感谢提醒!但是,他的程序需要监听管道上的数据,'cmd'不会帮助解决这个问题。 – abarnert 2013-02-15 22:56:34

3

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”之类的消息。

如果你打电话http.serve_forever()或类似上twistedHTTPServer等等,它做同样的事情,但它是一个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,在Unix管道上使用fcntl,或者我不记得在Windows管道上我的头顶上,以确保。

事实上,即使您需要等待多个来源,您也可以通过将每个来源的阻止循环放入一个单独的线程(或进程)中来执行此操作。这对于成千上万的套接字不起作用(尽管你可以在这种情况下使用greenlet而不是线程),但是对于3或者30也是可以的。