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()
或类似上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
,在Unix管道上使用fcntl
,或者我不记得在Windows管道上我的头顶上,以确保。
事实上,即使您需要等待多个来源,您也可以通过将每个来源的阻止循环放入一个单独的线程(或进程)中来执行此操作。这对于成千上万的套接字不起作用(尽管你可以在这种情况下使用greenlet而不是线程),但是对于3或者30也是可以的。
请详细说明你的要求...告诉我们你想要达到的目标,而不是你想要达到的目标。 – ajon 2013-02-15 22:00:45
'gtk.main()'有什么问题? – sth 2013-02-15 22:05:37