Подтвердить что ты не робот

Простая потоковая обработка в Python 2.6 с помощью thread.start_new_thread()

Я следую учебнику по простой потоковой передаче. Они приводят этот пример, и когда я пытаюсь его использовать, я получаю непонятные ошибки от интерпретатора. Не могли бы вы рассказать мне, почему это не работает? Я нахожусь на WinXP SP3 w/Python 2.6 current

import thread

def myfunction(mystring,*args):
    print mystring


if __name__ == '__main__':

    try:

        thread.start_new_thread(myfunction,('MyStringHere',1))

    except Exception as errtxt:
        print errtxt

Выполнение этого результата в::

Необработанное исключение в потоке, начатое Ошибка в sys.excepthook:

Исходное исключение:

Информация, отсутствующая в ошибке, на выходе отсутствует.

4b9b3361

Ответ 1

Проблема в том, что ваш основной поток прекратил работу до того, как ваш новый поток успеет закончить. Решение состоит в том, чтобы ждать вашего основного потока.

import thread, time

def myfunction(mystring,*args):
    print mystring


if __name__ == '__main__':

    try:

        thread.start_new_thread(myfunction,('MyStringHere',1))

    except Exception, errtxt:
        print errtxt

    time.sleep(5)

В качестве побочного примечания вы, вероятно, захотите использовать модуль потоковой передачи. Ваш основной поток будет ждать завершения всех этих типов потоков перед выходом:

from threading import Thread

def myfunction(mystring,*args):
    print mystring


if __name__ == '__main__':

    try:
        Thread(target=myfunction, args=('MyStringHere',1)).start()
    except Exception, errtxt:
        print errtxt

Ответ 2

Вам нужно подождать, пока ваш Thread завершит свою работу, поэтому вам нужно использовать Thread.join():

from threading import Thread

def myfunction(mystring,*args):
    print mystring

if __name__ == '__main__':

    try:
        t = Thread(None,myfunction,None,('MyStringHere',1))
        t.start()
        t.join()
    except Exception as errtxt:
        print errtxt

Ответ 3

import thread

def myfunction(mystring,*args):
    print mystring

if __name__ == '__main__':

    try:

        thread.start_new_thread(myfunction,('MyStringHere',1))

    except Exception as errtxt:
        print errtxt

while 1:
    pass

Положите цикл while наконец, он будет работать для вас.

Ответ 4

Я попробовал его в Python 2.5 на Mac, после изменения

except Exception as errtxt:

к

except Exception, errtxt:

Программа не выдавала исключение, а также ничего не печатала. Не уверен, что это полезно, но мне это любопытно...

Ответ 5

Когда я запускал этот код в Python 2.6, он работал, возможно, у вас уже есть открытые потоки, которые заблокированы функцией? Я рекомендую полностью закрыть Python, проверив ваши запущенные процессы, чтобы убедиться, что ничего не работает и повторите попытку.