
[ Россум, Дрейк, Откидач ] Язык программирования Python
.pdf21.17. socket — сетевой интерфейс низкого уровня |
311 |
значению системной переменной errno при возникновении ошибки. Метод может быть полезен для асинхронных соединений.
fileno()
Возвращает файловый дескриптор сетевого соединения (целое число). Может быть полезен совместно с функцией select.select().
getpeername()
Возвращает адрес удаленного узла, с которым установлено соединение. Формат возвращаемого значения зависит от семейства, к которому относится адрес (см. начало раздела). Метод может быть полезен, например, для определения номера порта на другом конце IP соединения.
getsockname()
Возвращает собственный адрес. Формат возвращаемого значения зависит от семейства, к которому относится адрес (см. начало раздела). Метод может быть полезен, например, для определения номера порта.
getsockopt(level, optname [, buflen])
Возвращает значение опции optname. В качестве аргумента optname может быть использована одна из символических констант вида SO_*, определенных в модуле. Если аргумент buflen опущен, возвращает целочисленное значение опции. Если аргумент buflen задан, он указывает максимальную длину возвращаемой строки.
listen(backlog)
Ожидает установления сетевого соединения. Аргумент backlog определяет максимальное число соединений в очереди и должен быть не меньше единицы (максимальное значение зависит от системы, обычно равно 5).
makefile([mode [, bufsize]])
Возвращает файловый объект (типа file, см. раздел 11.7), ассоциированный с сетевым соединением. Файловый объект ссылается на дубликат файлового дескриптора для сетевого соединения, таким образом, файловый объект и объект сетевого соединения могут быть закрыты (в том числе неявно — при достижении нуля количества ссылок на объект) независимо друг от друга. Аргументы mode и bufsize имеют такое же значение, как и для встроенной функции open().
recv(bufsize [, flags])
Получает данные через сетевое соединение и возвращает их в виде строки. Максимальное количество данных, получаемое за один раз, определяется аргументом bufsize. Описание возможных значений аргумента flags смотрите в документации для системной функции recv().
recvfrom(bufsize [, flags])
Работает аналогично методу recv(), но возвращает пару ‘(string, address)’, где string — строка с полученными данными и address — адрес, с которого данные были посланы. Формат address зависит от семейства, к которому относится адрес (см. начало раздела).

312 Глава 21. Доступ к средствам, предоставляемым операционной . . .
send(string [, flags])
Посылает данные через сетевое соединение. Соединение должно быть установленным. Аргумент flags имеет такое же значение, как и для метода recv(). Возвращает размер посланных данных в байтах.
sendto(string [, flags], address)
Посылает данные на узел с адресом address. Соединение не должно быть установленным. Аргумент flags имеет такое же значение, как и для метода recv(). Возвращает размер посланных данных в байтах. Формат аргумента зависит от семейства, к которому относится адрес (см. начало раздела).
setblocking(flag)
Если flag равен 0, устанавливает режим без блокировки, иначе устанавливает режим с блокировкой. Изначально все сетевые соединения находятся в режиме с блокировкой. В режиме без блокировки, если операция recv() или send() не может быть выполнена немедленно, генерируется исключение error. В режиме с блокировкой вызов методов recv() или send() приведет к блокированию до тех пор, пока операция не будет выполнена.
setsockopt(varlevel, optname, value)
Устанавливает значение опции optname равным value. В качестве аргумента optname может быть использована одна из символических констант вида SO_*, определенных в модуле. Аргумент value может быть целым числом или строкой с упакованными данными.
shutdown(how)
Отключает одну или обе половины соединения. Если аргумент how равен 0, в дальнейшем получение данных будет запрещено. Если аргумент how равен 1, запрещена будет передача данных. Если аргумент how равен 2, в дальнейшем будет запрещено как получение, так и передача данных.
Приведем два простых примера, использующих TCP/IP протокол: сервера, посылающего назад полученные данные (обслуживая только одного клиента), и клиента, его использующего. Обратите внимание, что сервер должен вызвать последовательно методы socket(), bind(), listen(), accept() (возможно повторяя вызов accept(), если необходимо обслуживать несколько клиентов), в то время как клиенту необходимо выполнить только socket(), connect(). Кроме того, сервер применяет методы send() и recv() не к объекту, ожидающему соединения, а к новому объекту, возвращаемому методом accept().
#уЕТЧЕТ import socket
#мПЛБМШОЩК ХЪЕМ HOST = ’’
#рТПЙЪЧПМШОЩК ОЕРТЙЧЙМЕЗЙТПЧБООЩК РПТФ PORT = 50007
21.18. select — ожидание завершения ввода/вывода |
313 |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print ’рПДУПЕДЙОЙМЙУШ У БДТЕУБ’, addr while 1:
data = conn.recv(1024) if not data: break conn.send(data)
conn.close()
#лМЙЕОФ import socket
#хДБМЕООЩК ХЪЕМ
HOST = ’daring.cwi.nl’
# фПФ ЦЕ РПТФ, ЮФП ЙУРПМШЪХЕФУС УЕТЧЕТПН PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT))
s.send(’Hello, world’) data = s.recv(1024) s.close()
print ’рПМХЮЕООЩЕ ДБООЩЕ:’, ‘data‘
21.18 select — ожидание завершения ввода/вывода
Этот модуль предоставляет доступ к системным функциям select() и poll(). Заметим, что в Windows функция select() работает только для сетевых соединений. В UNIX средства, предоставляемые модулем, работают также с другими типами файлов, в частности, каналами. Однако эти средства не могут быть использованы для определения увеличения в размерах обычного файла.
error
Исключения этого класса генерируются при возникновении различных ошибок. В качестве аргументов при инициализации используются номер системной ошибки и соответствующая ему поясняющая строка.
select(iwtd, owtd, ewtd [, timeout])
Первые три аргумента — списки, которые могут содержать файловые дескрипторы или объекты с методом fileno(), возвращающим файловый дескриптор. iwtd — список объектов для ввода, owtd — для вывода и ewtd — для исключительных ситуаций (вывода ошибок). Аргумент timeout указывает максимальное
314 |
Глава 21. Доступ к средствам, предоставляемым операционной . . . |
время ожидания, если он опущен, функция блокирует выполнение до тех пор, пока один из дескрипторов не будет готов.
Функция select() возвращает кортеж из трех списков, являющихся подсписками аргументов iwtd, owtd и ewtd и содержащих объекты, готовые к вводу/выводу. При достижении максимального времени ожидания, возвращает кортеж из трех пустых списков.
poll() (большинство вариантов UNIX) Возвращает объект, поддерживающий регистрацию файловых дескрипторов и реализующий их опрос на предмет наступления событий ввода/вывода.
Объекты, возвращаемые функцией poll(), имеют следующие методы:
register(fd [, eventmask])
Регистрирует файловый дескриптор (или объект с методом fileno(), возвращающим файловый дескриптор) fd. При последующих вызовах метода poll() файловый дескриптор будет проверяться на предмет наступления событий ввода/вывода. Аргумент eventmask может быть комбинацией (с помощью оператора ‘|’) констант POLLIN, POLLPRI и POLLOUT и указывает интересующие типы событий. По умолчанию проверяется наступление событий всех трех типов. Повторная регистрация одного и того же файлового дескриптора не является ошибкой.
unregister(fd)
Снимает с регистрации файловый дескриптор (или объект с методом fileno(), возвращающим файловый дескриптор) fd. При попытке снять с регистрации объект, который не был зарегистрирован, будет сгенерировано исключение KeyError.
poll([timeout])
Опрашивает зарегистрированные файловые дескрипторы на предмет наступления событий ввода/вывода и возвращает список пар вида ‘(fd, event)’, где fd — файловый дескриптор, для которого наступило событие и возникла ошибка, и event — комбинация констант (см. ниже), описывающих наступившее событие или возникшую ошибку. Аргумент timeout указывает максимальное время ожидания, если он опущен, метод блокирует выполнение до тех пор, пока один из дескрипторов не будет готов. При достижении максимального времени ожидания, возвращает пустой список.
Ниже приведены константы, комбинации которых могут быть использованы в качестве аргумента eventmask метода register() и в результате, возвращаемом методом poll():
POLLIN
Имеются данные для чтения.
POLLPRI
Имеются экстренные данные для чтения.
21.19. mmap — отображение файлов в память |
315 |
POLLOUT
Файловый дескриптор готов к выводу (то есть запись не приведет к блокированию).
POLLERR
Исключительная ситуация.
POLLHUP
Зависание.
POLLNVAL
Неверный запрос: дескриптор не открыт.
21.19mmap — отображение файлов в память
Модуль mmap доступен в операционных системах UNIX и Windows и позволяет отображать файлы в память. Объекты, представляющие отображенные в память файлы, ведут себя с одной стороны как изменяемые строки, с другой — как файловые объекты. В большинстве случаев вы можете использовать эти объекты вместо строк. Например, с помощью модуля re Вы можете осуществлять поиск в отображенном в память файле. Вы можете вносить изменения в файл как в изменяемую последовательность (например, ‘mapped_file[i] = char’ или ‘mapped_file[i:j] = string’) различными способами, если эти изменения не требуют изменения размера файла.
Модуль определяет следующий конструктор:
mmap(fd, size [, *platform_args])
Отображает в память size байт файла, соответствующего файловому дескриптору fd. Если Вы хотите отобразить файл, соответствующий файловому объекту, — используйте его метод fileno().
Назначение дополнительных аргументов (platform_args) зависит от используемой платформы. В Windows может быть указано имя создаваемого отображения (повторное использование имени приведет к использованию ранее созданного отображения). В UNIX могут быть указаны два дополнительных аргумента: flags и prot. Аргумент flags может иметь значение MAP_SHARED (используется по умолчанию) или MAP_PRIVATE и определяет характер отображения. В качестве аргумента prot может использоваться комбинация из констант PROT_* (по умолчанию используется PROT_READ | PROT_WRITE), определяющих желаемую степень защиты памяти.
В качестве значений аргументов, характерных для UNIX, Вы можете использовать следующие константы (наиболее важные):
MAP_SHARED
Отображение является общим для всех процессов.
316 |
Глава 21. Доступ к средствам, предоставляемым операционной . . . |
MAP_PRIVATE
Отображение является частным. При внесении изменений создается копия. Таким образом, все изменения видны только текущему процессу.
PROT_READ
Обеспечивает доступ к отображению на чтение.
PROT_WRITE
Обеспечивает доступ к отображению на запись.
Объекты, представляющие отображенный в память файл, имеют следующие мето-
ды:
close()
Закрывает отображение. Последующие операции над объектом приведут к ошибке.
find(string [, start])
Возвращает наименьший индекс, указывающий, где найдена подстрока string. Аргумент start является индексом, указывающим с какого места необходимо производить поиск (по умолчанию он равен 0).
flush([offset, size])
Сбрасывает на диск изменения, внесенные в отображение файла. Без вызова этого метода не гарантируется, что внесенные изменения будут записаны до того, как объект отображения будет уничтожен. Если указаны аргументы offset и size, то сбрасываются только изменения в диапазоне (в байтах) от offset до offset + size, в противном случае сбрасывается все содержимое.
move(dest, src, count)
Копирует count байт из диапазона, начинающегося с индекса src, в диапазон, начинающийся с индекса dest.
read_byte()
Считывает и возвращает один символ из отображенного файла, то есть возвращает строку с одним символом в текущей позиции отображенного файла и перемещает указатель на 1.
readline()
Считывает и возвращает строку из отображенного файла, начиная с текущей позиции, до символа перехода на новую строку (включая его) или конца отображения.
resize(newsize)
Изменяет размер отображенного в память файла. Размер отображения становится равным newsize байт.
seek(pos [, whence])
Устанавливает текущую позицию в файле. Необязательный аргумент whence указывает на точку отсчета: 0 (по умолчанию) — начало файла, 1 — текущая позиция и 2 — конец файла.
21.19. mmap — отображение файлов в память |
317 |
size()
Возвращает размер файла в байтах, который может быть больше размера отображенной в память области.
tell()
Возвращает текущую позицию в файле.
write(string)
Записывает строку string в отображенный файл, начиная с текущей позиции. После этого указатель устанавливается на следующий после записанной строки байт.
write_byte(byte)
Записывает один символ byte в отображенный файл (перемещает указатель на 1).

318
Глава 22
Средства организации многопоточных программ
thread Создание нескольких потоков и управление ими.
threading Средства высокого уровня организации потоков.
Queue Синхронизированные очереди.
22.1thread — создание нескольких потоков и управление ими
Модуль thread предоставляет средства низкого уровня для работы с несколькими потоками, совместно использующими глобальные данные. Для синхронизации модуль предоставляет простые средства блокировки.
error
Исключения этого класса генерируются в случае возникновения ошибок, специфичных для этого модуля.
LockType
Объект типа для объектов блокировки.
start_new_thread(function, args [, kwargs])
Создает новый поток и выполняет в нем функцию function, используя в качестве позиционных и именованных аргументов args (кортеж) и kwargs (словарь).
exit() exit_thread()
Генерирует исключение SystemExit. Если исключение (в данном потоке) не обрабатывается, выполнение потока будет молча завершено. Имя exit_thread() определено для совместимости со старыми версиями.
allocate_lock()
Возвращает новый объект, реализующий блокировку. Изначально объект не является заблокированным.
22.1. thread — создание нескольких потоков и управление ими |
319 |
get_ident()
Возвращает идентификатор текущего потока (отличное от нуля целое число). После завершения работы потока его идентификатор может быть использован повторно для нового потока.
Объекты, возвращаемые функцией allocate_lock, имеют следующие мето-
ды:
acquire([waitflag])
При вызове без аргументов захватывает (блокирует) объект, дождавшись, если это необходимо, его освобождения другим потокам (возвращает None). Если задан аргумент waitflag (целое число), поведение функции зависит от его значения: 1 — функция ожидает освобождения объекта другим потокам (так же, как и с опущенным аргументом), 0 (и другие значения) — объект захватывается только, если это может быть сделано немедленно. При наличии аргумента функция возвращает 1, если захват объекта прошел успешно, в противном случае возвращает 0.
release()
Освобождает объект. Объект должен быть захвачен ранее, но не обязательно в этом же потоке.
locked()
Возвращает текущий статус объекта: 1, если объект захвачен (заблокирован), иначе — 0.
Замечания:
Если доступен модуль signal, прерывание (исключение KeyboardInterrupt) получает основной поток. Однако, если модуль signal недоступен, прерывание может получить любой поток.
Вызов функций sys.exit() и thread.exit() и генерация исключения SystemExit эквивалентны.
Не все функции, реализованные на языке C, при ожидании ввода/вывода позволяют выполняться другим потокам, но наиболее популярные (функции time.sleep() и select.select(), метод read() файловых объектов) работают правильно.
Невозможно прервать выполнение метода acquire() объектов, предназначенных для блокировки, — исключение KeyboardInterrupt будет сгенерировано только после захвата объекта.
Поведение при завершении работы основного потока раньше других зависит от платформы. Обычно остальные потоки немедленно завершают свою работу без выполнения ветвей finally инструкций try и вызова деструкторов объектов.
320 |
Глава 22. Средства организации многопоточных программ |
22.2threading — средства высокого уровня организации потоков
Модуль threading предоставляет средства высокого уровня для работы с несколькими потоками, реализованные поверх модуля thread. Этот модуль безопасен для импортирования с помощью инструкции ‘from threading import *’.
activeCount()
Возвращает число объектов, представляющих активные потоки. Это значение равно длине списка, возвращаемого функцией enumerate().
Condition([lock])
Создает и возвращает объект, реализующий условие. Этот объект позволяет одному или нескольким потокам ожидать уведомления от другого потока. Если задан аргумент lock, он должен быть объектом, возвращаемым функцией Lock() или RLock(). Этот объект будет использован для блокировки. По умолчанию создается новый объект с помощью функции RLock().
currentThread()
Возвращает объект, соответствующий текущему потоку. Если текущий поток не был создан с помощью модуля threading, возвращаемый объект будет иметь ограниченную функциональность.
enumerate()
Возвращает список объектов, соответствующих активным потокам, созданным с помощью модуля threading (в том числе и фоновые). Список всегда включает объекты для текущего и основного потока и не включает объекты, соответствующие потокам, которые уже завершили или еще не начали свое выполнение.
Event()
Создает и возвращает объект, реализующий событие. Этот объект позволяет потоку ожидать наступления (установки в другом потоке) события.
Lock()
Создает и возвращает объект, реализующий примитивную блокировку. В текущих реализациях является псевдонимом для функции thread.allocate_lock().
RLock()
Создает и возвращает объект, реализующий блокировку. В отличие от объекта, возвращаемого функцией Lock(), допускает повторный захват в том же потоке. Объект должен быть освобожден тем же потоком ровно столько раз, сколько он был захвачен.
Semaphore([count])
Создает и возвращает объект, реализующий семафор. Семафор может быть захвачен не более count раз (по умолчанию 1). При последующих попытках захватить семафор ожидает, пока другой поток не освободит его.