我正在使用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 )线程中运行?我问,因为我正在使用GUI工具包(GTK),并且在以这种方式调用回调时偶尔会出现X错误(和段错误)(是的,我知道gobject.idle_add)。
提前感谢您,对不起我的愚蠢问题。
答案 0 :(得分:13)
使用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`
换句话说,回调在新创建的线程中运行。
答案 1 :(得分:0)
你搞砸了glib和线程:
在您的示例中,callback
/ cb_func
将在与th_func
相同的主题中调用。因为你正在直接打电话。
使用glib和glib.idle_add
,您将调度将在glib的主循环中发生的调用。该调用是间接的:只要你在执行idle_all时就会调用该函数,但是稍后会调用该函数。
(现在,如果你开始在一个线程中做某事,那么执行idle_add(),你就会明白它会在不同的线程中发生。这可能是你得到的错误。)