Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2010 20:39:59

Carzil
От:
Зарегистрирован: 2010-05-26
Сообщения: 106
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить поток?

Есть класс:

#!/usr/bin/python
import threading
class t(threading.Thread):
def run(self):
for i in xrange(0, 103):
print i
Собственно, вопрос: как остановить выполнение потока на рандомном числе?



Отредактировано (Дек. 8, 2010 21:56:48)

Офлайн

#2 Дек. 8, 2010 20:44:32

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как остановить поток?

Выйти из функции run.
http://asvetlov.blogspot.com/2010/11/1.html - как для вас писал :)



Офлайн

#3 Дек. 8, 2010 20:56:57

Carzil
От:
Зарегистрирован: 2010-05-26
Сообщения: 106
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить поток?

Это я уже понял. А как остановить выполнение функции вне функции??



Офлайн

#4 Дек. 8, 2010 21:23:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как остановить поток?

Читать умеете? Снаружи завершить поток нельзя.
Можно извне взводить какой-нибудь флаг, и в потоке его проверять. Других безопасных способов не существует.



Офлайн

#5 Дек. 8, 2010 21:59:49

Carzil
От:
Зарегистрирован: 2010-05-26
Сообщения: 106
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить поток?

Задача: как только придёт сообщение от сокета, сразу оборвать raw_input() и вывести вновь пришедшее сообщение. Как это сделать?
to Андрей Светлов: и как такую задачу решить с помощью флагов?



Отредактировано (Дек. 8, 2010 22:01:20)

Офлайн

#6 Дек. 8, 2010 22:15:44

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как остановить поток?

Carzil
Задача: как только придёт сообщение от сокета, сразу оборвать raw_input() и вывести вновь пришедшее сообщение. Как это сделать?
to Андрей Светлов: и как такую задачу решить с помощью флагов?
И где здесь потоки? К слову, raw_input “оборвать” не выйдет. Придется городить что-то другое.



Офлайн

#7 Дек. 8, 2010 22:28:21

Carzil
От:
Зарегистрирован: 2010-05-26
Сообщения: 106
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить поток?

У нас есть два потока: один слушает соединение, а другой - пользовательский ввод. А что можно нагородить? :(



Офлайн

#8 Дек. 9, 2010 02:11:06

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как остановить поток?

У вас нестандартная хотелка.
Для CLI подобное не требуется.
GUI и по настоящему консольные системы вроде curses делают ввод немного иначе.
Работу raw_input нельзя прервать программно.

Может, вам на самом деле нужна не консоль?

Представил себе эту красоту: вколачиваю я текст, а прога внезапно (сообщение, понимаете ли, пришло) мои попытки рубит на корню, печатает это чертово сообщение и предлагает мне ввести всё заново, более расторопно щелкая по кнопкам. А то вдруг еще одно сообщение придёт…



Офлайн

#9 Дек. 9, 2010 03:31:41

Eliont
От:
Зарегистрирован: 2010-05-30
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Как остановить поток?

Поток - прервать нельзя. Процесс - можно.

В питоне есть модуль processing - попробуй его заюзать.

Хотя можешь порыскать по сети - я находил рецепты-извращения, связаные, например, с пропихиванием исключения внутрь потока, но всё равно с атомарными операциями это не прокатит.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version