Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2008 23:57:06

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

вот это почему то не всегда убивает поток..
я не могу понять, от чего зависит - убивает или нет, но помойму от запущенной в потоке функции с активным time.sleep .. я совершенно не понимаю как это работает(( но как зделать, чтоб оно всетаки убивало,?

class Thread(threading.Thread):
def _async_raise(self,tid, exctype):
"""raises the exception, performs cleanup if needed"""
if not inspect.isclass(exctype):
raise TypeError("Only types can be raised (not instances)")
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
raise SystemError("PyThreadState_SetAsyncExc failed")

def _get_my_tid(self):
"""determines this (self's) thread id"""
if not self.isAlive():
raise threading.ThreadError("the thread is not active")

# do we have it cached?
if hasattr(self, "_thread_id"):
return self._thread_id

# no, look for it in the _active dict
for tid, tobj in threading._active.items():
if tobj is self:
self._thread_id = tid
return tid

raise AssertionError("could not determine the thread's id")

def raise_exc(self, exctype):
"""raises the given exception type in the context of this thread"""
self._async_raise(self._get_my_tid(), exctype)

def terminate(self):
"""raises SystemExit in the context of the given thread, which should
cause the thread to exit silently (unless caught)"""
self.raise_exc(SystemExit)




POTOK.terminate()



Отредактировано (Окт. 22, 2008 00:12:20)

Офлайн

#2 Окт. 22, 2008 00:11:47

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

попробовал вот это

 
class KThread(threading.Thread):
"""A subclass of threading.Thread, with a kill()
method."""
def __init__(self, *args, **keywords):
threading.Thread.__init__(self, *args, **keywords)
self.killed = False

def start(self):
"""Start the thread."""
self.__run_backup = self.run
self.run = self.__run # Force the Thread to
install our trace.
threading.Thread.start(self)

def __run(self):
"""Hacked run function, which installs the
trace."""
sys.settrace(self.globaltrace)
self.__run_backup()
self.run = self.__run_backup

def globaltrace(self, frame, why, arg):
if why == 'call':
return self.localtrace
else:
return None

def localtrace(self, frame, why, arg):
if self.killed:
if why == 'line':
raise SystemExit()
return self.localtrace

def kill(self):
self.killed = True
тот же результат.. не всегда убивает..



Офлайн

#3 Окт. 22, 2008 00:35:58

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

таак…чето я забыл(( а чем можно заменить time.sleep? дето целую тему видел.. а где - не помню(



Офлайн

#4 Окт. 22, 2008 02:44:26

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

for i in xrange(100): time.sleep(0.01)

много мелких sleep заменяют один крупный =)



Офлайн

#5 Окт. 22, 2008 03:09:09

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

Можно сделать такой финт ушами :)
Не блокирующая поток пауза на 10 секунд:

c = threading.Condition()
c.acquire()
c.wait(10)



Отредактировано (Окт. 22, 2008 03:13:18)

Офлайн

#6 Окт. 22, 2008 17:31:22

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

странно.. это оказалось не изза слипа…
оно не хочет убивать поток очень часто в повседневной работе… хз почему(

чтож делать,? мне оч надо убивать потоки… без этого питон кидать прийдется..(



Отредактировано (Окт. 22, 2008 17:35:57)

Офлайн

#7 Окт. 22, 2008 17:59:31

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

Потоки могут быть заблокированы на вводе-выводе, или на внешних С расширениях.
В таком случае ничего не остается, как юзать processing. =)
Судя, по приложенным к нему бенчмаркам его скорость близка к Threading.



Отредактировано (Окт. 22, 2008 18:01:02)

Офлайн

#8 Окт. 22, 2008 23:16:10

124bit
От:
Зарегистрирован: 2008-04-10
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

пасиба… ща попробую



Офлайн

#9 Окт. 23, 2008 02:36:10

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

кстати! а в чем необходимость поток убить?
Мне кажется, это считается экстренным случаем (ну кроме может Erlang и ему подобных).
Правильный способ - это выйти из нити по какому-нибудь флагу.

Вот например, нить захватила у тебя какой-нибудь ресурс общий (залочила) а ты ее бах… и убил.
Получается ДедЛок =)

Update:
Вот полемика Гвидо на эту тему =)
http://bugs.python.org/issue221115



Отредактировано (Окт. 23, 2008 03:08:04)

Офлайн

#10 Окт. 23, 2008 12:07:43

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Убить поток 2

time.sleep -> Event.wait – это первое

второе - таймауты на синхронные операции.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version