关于线程和回调

时间:2012-01-16 22:50:46

标签: python multithreading thread-safety

我正在使用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)。

提前感谢您,对不起我的愚蠢问题。

2 个答案:

答案 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(),你就会明白它会在不同的线程中发生。这可能是你得到的错误。)