关于线程和回调
我在用Python和线程工作了一段时间,但对回调函数还有点疑问。看看下面这段代码:
import threading
def cb_func(data):
"""The callback function"""
print data
def th_func(callback):
"""The threaded function"""
# do some work here
callback('somedata')
thr = threading.Thread(target=th_func, args=(cb_func,)).start()
根据这段代码,cb_func这个函数会在主线程中运行,还是在新创建的(thr)线程中运行呢?我问这个是因为我在使用一个图形用户界面工具包(GTK),有时候在这样调用回调函数时会遇到X错误(还有段错误)。我知道gobject.idle_add这个方法。
提前谢谢你,抱歉问了这么个傻问题。
2 个回答
0
你在使用glib和线程时搞混了:
在你的例子中,
callback
/cb_func
会在和th_func
相同的线程中被调用。因为你是直接调用的。使用glib的
glib.idle_add
时,你是在安排一个将在glib的主循环中执行的调用。这个调用是间接的:这个函数不会立刻在你调用idle_add时执行,而是会在稍后的某个时间执行。
(现在,如果你在一个线程中开始做某件事,然后调用idle_add(),你会明白这会在不同的线程中发生。这可能就是你遇到的错误。)
14
有一个简单的方法可以检查,使用 current_thread().name
:
import threading
def cb_func():
"The callback function."
print 'Callback, in thread %s' % threading.current_thread().name
def th_func(callback):
"The threaded function."
# ...
callback()
thr = threading.Thread(target=th_func, args=(cb_func,)).start()
运行这个代码会输出(对我来说,在Ubuntu 11.04,python 2.7.1上):
Callback, in thread Thread-1`
换句话说,回调函数是在新创建的线程中运行的。