Простая потоковая обработка в 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:
Исходное исключение:
Информация, отсутствующая в ошибке, на выходе отсутствует.
Ответы
Ответ 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, проверив ваши запущенные процессы, чтобы убедиться, что ничего не работает и повторите попытку.