Python 关于线程和回调

Python 关于线程和回调,python,multithreading,thread-safety,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.Th

有一段时间我正在使用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个错误(和SEGFULTS)(是的,我知道gobject.idle_add)


提前感谢您,并为我的愚蠢问题感到抱歉。

有一种简单的方法可以使用
当前线程()进行检查。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上):


换句话说,回调在新创建的线程中运行。

您被glib和线程搞得一团糟:

  • 在您的示例中,
    回调
    /
    cb_func
    将在与
    th_func
    相同的线程中调用。因为你在打直拨电话

  • 使用glib和
    glib.idle\u add
    ,您正在安排一个将在glib主循环中发生的调用。调用是间接的:函数不会在执行idle\u all时立即调用,而是稍后调用

(现在,如果您开始在一个线程中执行某些操作,那么执行idle_add(),您将了解它将在不同的线程中发生。这可能就是您得到的错误。)

Callback, in thread Thread-1`