Анимация
JavaScript
|
Главная Библионтека 21.16. signal - обработка асинхронных событий 305 ссылками в новом дереве, в противном случае, в новое дерево будет скопировано содержимое файлов, на которые указывают символические ссылки. Ошибки, возникающие при копировании, выводятся на стандартный поток ошибок. Эту функцию следует воспринимать скорее как пример (см. исходный текст модуля), нежели как реальное средство для работы с файлами. rmtree (path [, ignore errors [, onerror]]) Удаляет полностью дерево каталогов path. Если установлен и является истиной аргумент ignore errors, ошибки, возникающие при удалении, будут проигнорированы, в противном случае для обработки ошибок вызывается функция onerror (или генерируется исключение, если аргумент onerror не задан). Обработчик ошибок onerror должен поддерживать вызов с тремя аргументами: function, path и excinfo. function - функция, которая сгенерировала исключение (os.removeO или os.rmdir() ), path - имя пути, которое было передано функции function, и excinfo - информация об исключении, возвращаемая функцией sys.exc info(). Исключения, сгенерированные обработчиком ошибок, не обрабатываются. 21.16 signal - обработка асинхронных событий Этот модуль предоставляет возможность устанавливать обработчики сигналов. Несколько общих правил: • Однажды установленный обработчик сигнала остается до тех пор, пока Вы явно не восстановите исходный обработчик. Единственное исключение из этого правила - обработчик сигнала SIGCHLD, работа которого зависит от реализации на данной платформе. • Не существует способа временно заблокировать сигналы в критических местах. • Хотя обработчики сигналов и вызываются асинхронно, это может произойти только между атомными инструкциями интерпретатора Python. Это значит, что если сигнал поступает в момент длительной работы процедуры, полностью реализованной на языке C (например, использование регулярного выражения для поиска в длинном тексте), его обработка может быть отложена на произвольное время. • При поступлении сигнала во время выполнения операции ввода/вывода после завершения обработки сигнала может быть сгенерировано исключение. • Не имеет особого смысла обработка синхронных ошибок, таких как SIGFPE или SIGSEGV. • Интерпретатор устанавливает некоторое количество обработчиков по умолчанию: сигнал SIGPIPE игнорируется (таким образом, уведомление об ошибках при работе с каналами и сетевыми соединениями может быть выполнено генерацией обычных исключений) и SIGINT генерирует исключение KeyboardInterrupt. Вы можете заменить любой из этих обработчиков. • Следует проявлять некоторую осторожность при использовании модуля в многопоточных программах. Основное правило: всегда вызывайте функцию signal() только в основном потоке. Любой поток может использовать функции alarm(), getsignal() и pause() , но только основной - устанавливать обработчик и получать сигнал. Таким образом, сигналы не могут быть использованы для связи между потоками - для этих целей следует использовать блокировки. Модуль signal определяет следующие константы и функции: SIG DFL Используется в качестве аргумента функции signal() и значения, возвращаемого функцией getsignal() для обозначения обработчика, который используется системой (не интерпретатором) по умолчанию. SIG IGN Используется в качестве аргумента функции signal() для обозначения обработчика, игнорирующего сигнал. SIG* Символические константы для номеров сигналов. Модуль определяет константы только для тех сигналов, которые поддерживаются в данной системе. NSIG Имеет значение на единицу большее, чем максимальный номер сигнала в данной системе. alarm( time) (UNIX) Если аргумент time не равен нулю, запрашивает посылку сигнала SIGALRM текущему процессу через time секунд. Ранее запланированная посылка сигнала при этом отменяется. Возвращает время в секундах, которое оставалось до посылки ранее запланированного сигнала. Если аргумент time равен нулю, отменяет ранее запланированную посылку сигнала и возвращает время, которое оставалось до его посылки. Если функция alarm() возвращает 0, посылка сигнала до этого не была запланирована. getsignal( signalnum) Возвращает текущий обработчик сигнала с номером signalnum. Возвращаемое значение может быть объектом, поддерживающим вызов, или одним из специальных значений: signal.SIG IGN, signal.SIG DFL или None. Значение None означает, что обработчик не был установлен интерпретатором. pause() (UNIX) Приостанавливает выполнение процесса до получения сигнала, после чего будет вызван соответствующий обработчик. signal( signalnum, handler) Устанавливает handler в качестве обработчика сигнала с номером signalnum. Аргумент handler может объектом, поддерживающим вызов, или одним из специальных значений: SIG IGN или SIG DFL. Возвращает предыдущий обработчик сигнала. 21.17 socket - сетевой интерфейс низкого уровня Модуль socket предоставляет низкоуровневый доступ к сетевым соединениям. Этот модуль доступен для всех современных вариантов UNIX, Windows, Macintosh, BeOS, OS/2 и, возможно, для некоторых других платформ. Адреса для сетевых соединений представляются одной строкой для семейства AF UNIX и как пара (host, port) для семейства AF INET, где host - строка, содержащая имя узла (например, daring.cwi.nl) или IP адрес (например, 100.50.200.5), и port - номер порта. Воспринимаются также две специальные формы IP адресов: пустая строка соответствует INADDR ANY и строка <broadcast> соответствует INADDR BROADCAST. Поддержка режима без блокировки осуществляется через метод setblocking() . Модуль socket определяет следующие константы и функции: Функция handler будет вызываться для обработки сигнала signalnum с двумя аргументами: номер сигнала и текущий кадр стека (или None). В многопоточной программе при попытке вызвать эту функцию из неосновного потока генерируется исключение ValueError. Приведем простой пример, использующий функцию alarm() для того, чтобы ограничить время ожидания открытия файла. Это может быть полезно, если файл является последовательным устройством, который может быть не включенным. Использование функции os.open() для таких файлов приведет к зависанию. Для того, чтобы решить эту проблему, можно перед открытием файла запросить посылку сигнала SIGALRM через 5 секунд: если операция займет слишком много времени, будет послан сигнал и обработчик сгенерирует исключение. import signal, os def handler(signum, frame): raise IOError("Couldnt open device!") # Устанавливаем обработчик signal.signal(signal.SIGALRM, handler) # Запрашиваем посылку сигнала через 5 секунд signal.alarm(5) # Эта операция может привести к зависанию fd = os.open(/dev/ttyS0, os.O RDWR) # Отключаем посылку сигнала signal.alarm(0) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 [ 96 ] 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |