2012-01-16 2 views
3

Я работаю с 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 будет работать в основном потоке, или вновь созданный (Чет) нить? Я спрашиваю, потому что я работаю с инструментарием GUI (GTK), и иногда я получаю ошибки X (и segfault) при вызове обратных вызовов (да, я знаю о gobject.idle_add).

Спасибо заранее и извините за мой глупый вопрос.

ответ

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, питон 2.7.1):

Callback, in thread Thread-1` 

Другими словами, обратный вызов выполняется во вновь созданном потоке.

0

Вы перепутались с бойкими и нитями:

  • В вашем примере callback/cb_func будет вызываться в том же потоке, th_func. Потому что вы делаете прямой звонок.

  • С glib и glib.idle_add вы планируете вызов, который будет происходить в главном цикле glib. Вызов косвенный: функция будет вызываться не сразу, как только вы делаете idle_all, но позже.

(Теперь, если вы начинаете делать что-то в потоке, то сделайте idle_add(), вы поймете, что это будет происходить в другом потоке. И это может быть ошибка, которую вы получили.)

Смежные вопросы