Форум сайта python.su
вот это почему то не всегда убивает поток..
я не могу понять, от чего зависит - убивает или нет, но помойму от запущенной в потоке функции с активным 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)
Офлайн
попробовал вот это
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
Офлайн
таак…чето я забыл(( а чем можно заменить time.sleep? дето целую тему видел.. а где - не помню(
Офлайн
for i in xrange(100): time.sleep(0.01)
много мелких sleep заменяют один крупный =)
Офлайн
Можно сделать такой финт ушами :)
Не блокирующая поток пауза на 10 секунд:
c = threading.Condition()
c.acquire()
c.wait(10)
Отредактировано (Окт. 22, 2008 03:13:18)
Офлайн
странно.. это оказалось не изза слипа…
оно не хочет убивать поток очень часто в повседневной работе… хз почему(
чтож делать,? мне оч надо убивать потоки… без этого питон кидать прийдется..(
Отредактировано (Окт. 22, 2008 17:35:57)
Офлайн
Потоки могут быть заблокированы на вводе-выводе, или на внешних С расширениях.
В таком случае ничего не остается, как юзать processing. =)
Судя, по приложенным к нему бенчмаркам его скорость близка к Threading.
Отредактировано (Окт. 22, 2008 18:01:02)
Офлайн
пасиба… ща попробую
Офлайн
кстати! а в чем необходимость поток убить?
Мне кажется, это считается экстренным случаем (ну кроме может Erlang и ему подобных).
Правильный способ - это выйти из нити по какому-нибудь флагу.
Вот например, нить захватила у тебя какой-нибудь ресурс общий (залочила) а ты ее бах… и убил.
Получается ДедЛок =)
Update:
Вот полемика Гвидо на эту тему =)
http://bugs.python.org/issue221115
Отредактировано (Окт. 23, 2008 03:08:04)
Офлайн
time.sleep -> Event.wait – это первое
второе - таймауты на синхронные операции.
Офлайн