Простые потоки в Python 2.6 с помощью thread.start_new_thread () - PullRequest
12 голосов
/ 11 мая 2009

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

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:

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

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

Ответы [ 5 ]

24 голосов
/ 11 мая 2009

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

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
16 голосов
/ 12 мая 2009

Вам нужно подождать, пока ваш поток завершит свою работу, поэтому вы должны использовать 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
0 голосов
/ 17 декабря 2013
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, тогда он будет работать для вас.

0 голосов
/ 11 мая 2009

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

0 голосов
/ 11 мая 2009

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

except Exception as errtxt:

до

except Exception, errtxt:

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

...