Найти - Пользователи
Полная версия: Убить поток 2
Начало » Python для экспертов » Убить поток 2
1
124bit
вот это почему то не всегда убивает поток..
я не могу понять, от чего зависит - убивает или нет, но помойму от запущенной в потоке функции с активным 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()
124bit
попробовал вот это
 
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
тот же результат.. не всегда убивает..
124bit
таак…чето я забыл(( а чем можно заменить time.sleep? дето целую тему видел.. а где - не помню(
shiza
for i in xrange(100): time.sleep(0.01)

много мелких sleep заменяют один крупный =)
shiza
Можно сделать такой финт ушами :)
Не блокирующая поток пауза на 10 секунд:
c = threading.Condition()
c.acquire()
c.wait(10)
124bit
странно.. это оказалось не изза слипа…
оно не хочет убивать поток очень часто в повседневной работе… хз почему(

чтож делать,? мне оч надо убивать потоки… без этого питон кидать прийдется..(
shiza
Потоки могут быть заблокированы на вводе-выводе, или на внешних С расширениях.
В таком случае ничего не остается, как юзать processing. =)
Судя, по приложенным к нему бенчмаркам его скорость близка к Threading.
124bit
пасиба… ща попробую
shiza
кстати! а в чем необходимость поток убить?
Мне кажется, это считается экстренным случаем (ну кроме может Erlang и ему подобных).
Правильный способ - это выйти из нити по какому-нибудь флагу.

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

Update:
Вот полемика Гвидо на эту тему =)
http://bugs.python.org/issue221115
cybergrind
time.sleep -> Event.wait – это первое

второе - таймауты на синхронные операции.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB