关于线程和回调

3 投票
2 回答
10280 浏览
提问于 2025-04-17 10:23

我在用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`

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

撰写回答