Вкратце, JAR-файл представляет собой физический файл, структурированный так же, как zip-файл, который содержит файлы, используемые вашей программой во время выполнения. В jar обычно входят файлы .class, исполняемые версии ваших классов и другие ресурсы, такие как значки, изображения, файлы свойств, специфичные для языка, и т. Д. Учебное пособие по Java описывает банки и способы их создания / управления. (http://java.sun.com/docs/books/tutorial/jar/index.html)
Пакеты определены в этом разделе в учебном курсе Java на интерфейсах и пакетах: «Коллекция связанных классы и интерфейсы, обеспечивающие защиту доступа и управление пространством имен ». (Http://java.sun.com/docs/books/tutor...va/interpack/). Точно, я не считаю, что это определение само по себе действительно дает вам хорошее представление о том, что такое пакет. Для получения дополнительной информации перейдите на указанную страницу и прочитайте в этом разделе учебника.
Это обычно - плохой шаблон для уничтожения потока резко в Python и на любом языке. Думайте о следующих случаях:
хороший способ обработать это, если можно предоставить его (при управлении собственными потоками) состоит в том, чтобы иметь флаг exit_request, который каждый распараллеливает, проверяет равный интервал, чтобы видеть, пора ли ему выйти.
, Например:
import threading
class StoppableThread(threading.Thread):
"""Thread class with a stop() method. The thread itself has to check
regularly for the stopped() condition."""
def __init__(self):
super(StoppableThread, self).__init__()
self._stop_event = threading.Event()
def stop(self):
self._stop_event.set()
def stopped(self):
return self._stop_event.is_set()
В этом коде, необходимо звонить stop()
на потоке, когда Вы хотите, чтобы он вышел, и ожидал потока для выхода из правильно использования join()
. Поток должен проверить флаг остановки равномерно.
существуют случаи однако, когда действительно необходимо уничтожить поток. Пример - при обертывании внешней библиотеки, которая занята для длинных вызовов, и Вы хотите прервать его.
следующий код позволяет (с некоторыми ограничениями) повышать Исключение в потоке Python:
def _async_raise(tid, exctype):
'''Raises an exception in the threads with id tid'''
if not inspect.isclass(exctype):
raise TypeError("Only types can be raised (not instances)")
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(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(ctypes.c_long(tid), None)
raise SystemError("PyThreadState_SetAsyncExc failed")
class ThreadWithExc(threading.Thread):
'''A thread class that supports raising exception in the thread from
another thread.
'''
def _get_my_tid(self):
"""determines this (self's) thread id
CAREFUL : this function is executed in the context of the caller
thread, to get the identity of the thread represented by this
instance.
"""
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
# TODO: in python 2.6, there's a simpler way to do : self.ident
raise AssertionError("could not determine the thread's id")
def raiseExc(self, exctype):
"""Raises the given exception type in the context of this thread.
If the thread is busy in a system call (time.sleep(),
socket.accept(), ...), the exception is simply ignored.
If you are sure that your exception should terminate the thread,
one way to ensure that it works is:
t = ThreadWithExc( ... )
...
t.raiseExc( SomeException )
while t.isAlive():
time.sleep( 0.1 )
t.raiseExc( SomeException )
If the exception is to be caught by the thread, you need a way to
check that your thread has caught it.
CAREFUL : this function is executed in the context of the
caller thread, to raise an excpetion in the context of the
thread represented by this instance.
"""
_async_raise( self._get_my_tid(), exctype )
(На основе Потоки Killable Tomer Filiba. Кавычка о возвращаемом значении PyThreadState_SetAsyncExc
, кажется, от старая версия Python .)
, Как отмечено в документации, это не чудодейственное средство, потому что, если поток занят вне интерпретатора Python, это не поймает прерывание.
А хороший шаблон использования этого кода должен иметь поток, ловят определенное исключение и выполняют очистку. Тем путем можно прервать задачу и все еще иметь надлежащую очистку.
Лучше, если Вы не уничтожаете поток. Путь мог состоять в том, чтобы ввести блок "попытки" в цикл потока и выдать исключение, когда Вы хотите остановить поток (например, break/return/..., который останавливает Ваш for/while/...). Я использовал это на своем приложении, и оно работает...
Можно уничтожить поток путем установки трассировки в поток, который выйдет из потока. См. присоединенную ссылку для одной возможной реализации.
Вы никогда не должны насильственно уничтожать поток, не сотрудничая с ним.
Уничтожение потока удаляет любые гарантии, что блоки попытки/наконец настраивали, таким образом, Вы могли бы оставить блокировки заблокированными, файлы открытый, и т.д.
единственное время можно утверждать, что насильственно уничтожение распараллеливает, хорошая идея, должен закрыть программу быстро, но никогда единственные потоки.
Нет никакого официального API, чтобы сделать это, нет.
необходимо использовать API платформы для уничтожения потока, например, pthread_kill или TerminateThread. Можно получить доступ к такому API, например, через pythonwin, или через ctypes.
Уведомление, что это по сути небезопасно. Это, вероятно, приведет к безнадежному в отношении оплаты мусору (от локальных переменных стековых фреймов, которые становятся мусором), и может привести к мертвым блокировкам, если уничтожаемый поток имеет GIL в точке, когда это уничтожается.
Asuming, что Вы хотите иметь несколько потоков той же функции, это - по моему скромному мнению, самая легкая реализация для остановки один идентификатором:
import time
from threading import Thread
def doit(id=0):
doit.stop=0
print("start id:%d"%id)
while 1:
time.sleep(1)
print(".")
if doit.stop==id:
doit.stop=0
break
print("end thread %d"%id)
t5=Thread(target=doit, args=(5,))
t6=Thread(target=doit, args=(6,))
t5.start() ; t6.start()
time.sleep(2)
doit.stop =5 #kill t5
time.sleep(2)
doit.stop =6 #kill t6
хорошая вещь здесь, Вы можете иметь несколько из тех же и различных функций и остановить их всех functionname.stop
, Если Вы хотите иметь только один поток функции затем, Вы не должны помнить идентификатор. Просто остановитесь, если doit.stop
> 0.
Если вы пытаетесь завершить всю программу, вы можете установить поток как «демон». видеть Thread.daemon