Модуль multiprocessing: Минимальная документация по многопоточности
ДИСКЛЕЙМЕР! ДАННОЕ ОПИСАНИЕ НЕ ПРЕТЕНДУЕТ НА ПОЛНОТУ!
Данный модуль является близким аналогом модуля threading. Большинство объявлений описанных здесь совпадают с объявлениями threading.
Объявления
Не описанные в разделе объявления можно посмотреть в официальной документации.
Process | Определяет отдельный поток. После создания и настройки объекта его требуется запустить. |
---|---|
Queue | Очередь, используемая для обмена данными между потоками. Использует внутри себя Pipe. |
Pipe (connection) | Канал связи, который очень напоминает сокеты. |
Value | Общая для всех потоков переменная. |
Array | Общий для всех потоков массив. |
Класс Process
Конструктор
Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
Конструктор должен всегда вызываться с указанием параметров по ключевым словам. Всегда group=None.
target это функция, которая принимает указанные в args и kwargs аргументы. Этот код будет исполнен параллельно.
name это строка, обеспечивающая идентификацию процесса.
daemon булевая переменная, указывающая является ли процесс самостоятельным или вспомогательным для текущего. Смерть текущего процесса убивает все вспомогательные.
Также поток может быть создан с помощью наследования от этого класса, тогда потомок должен вызывать у родительского класса __init__() в конструкторе и переопределить метод run.
Методы
run() | Данный метод вызывается, если определён, при вызове метода start. Именно этот метод содержит код, который должен быть выполнен параллельно. |
---|---|
start() | Данный метод начинает исполнение потока. |
bool = is_alive() | Возвращает True, если поток исполняется. |
terminate() | Моментально и окончательно убивает процесс. Очень опасный метод. Повреждает заблокированные мьютексы и коннекторы. Может быть вызвано только процессом создавшим убиваемый процесс. |
close() | Освобождает все ресурсы, выделенные под процесс. Должен быть вызван ПОСЛЕ остановки процесса. |
Список атрибутов
pid | Возвращает ID процесса. |
---|---|
exitcode | Код, выброшенный при остановке процесса. |
Queue, Pipe, connection
Данные классы предназначены для связи между потоками.
Queue
Класс Queue существует для передачи последовательности сообщений от одного потока другому. Существуют не рассматриваемые здесь разновидности SimpleQueue и JoinableQueue. Оба класса очень похожи на обычную Queue. Относительно Queue из библиотеки queue есть одно очень важное отличие: все методы выдают приблизительное значение, т.к. нет гарантии что это значение не будет изменено другим потоком.
КонструкторQueue([maxsize])
Конструктор указывает максимальный размер очереди. В случае чтения пустой очереди и переполнения выбрасывается queue.Empty или queue.Full из стандартной библиотеки.
Методы
size = qsize() | Текущий размер очереди. |
---|---|
bool = empty() | Пустая ли очередь. |
bool = full() | Заполнена ли очередь. |
put(obj[, block[, timeout]]) | Кладёт объект к очередь, если очередь переполнена выбрасывает queue.Full. Если указан block = True, то в случае переполнения ждёт освобождения места в течении timeout или вечно. |
obj = get([block[, timeout]]) | Извлекает последний элемент из очереди и ждёт его появления в течении timeout, если block = True. Если элементов нет или время ожидания превышено выбрасывает исключение queue.Empty. |
close() | Закрывает внутренний поток взаимодействия |
Pipe & Connection
Функция conn1, conn2 = Pipe([duplex]) возвращает 2 конца "трубы", один из которых должен быть передан другому потоку. Оба конца являются экземплярами класса Connection. Если вызвать функцию Pipe с duplex = False, conn1 не сможет отправлять сообщения, а conn2 их принимать.
Методы. (Connection)
send(obj) | Отправляет объект, объект должен быть не слишком большим, а также сериализуемым с помощью pickle. |
---|---|
obj = recv() | Ожидает входящих данных. Если ожидание прервано методом close(), выбрасывает EOFError |
descr = fileno() | Возвращает файловый дескриптор |
close() | Разрушает соединение. |
obj = send_bytes(buffer[, offset[, size]]) | Отправляет bytearray, начиная с указанной позиции, отправляя указанное число байт. |
input = recv_bytes([maxlength])) | Ожидает входящий массив байт, размером не более maxlength. Если ожидание прервано методом close(), выбрасывает EOFError |
recv_bytes_into(buffer[, offset]) | Ожидает входящий массив байт, записывает его в buffer начиная с позиции offset. Если ожидание прервано методом close(), выбрасывает EOFError |
Синхронизация
Для обмена данными между потоками можно использовать блокировки и разделённую память. Блокировки являются стандартными семафорами. Все они поддерживают методы acquire(block=True, timeout=None) для блокировки и release() для разблокировки. Оставляю ссылки на них.
Lock | Стандартный нерекурсивный мьютекс. |
---|---|
RLock | Стандартный рекурсивный мьютекс. |
Semaphore | Стандартный семафор. |
Value
Конструктор Value(typecode_or_type, *args, lock=True). Возвращает ctypes объект, расположенный в разделённой памяти. typecode_or_type описывает тип данных, *args - аргументы конструктора для указанного типа.
lock - автоматическая ли синхронизация (содержит ли свой рекурсивный мьютекс). Если указано значение False, то вы сами должны заботиться об синхронизации.
Array
Конструктор Array(typecode_or_type, size_or_initializer, *, lock=True). Возвращает массив ctypes объектов, расположенный в разделённой памяти. size_or_initializer Это размер массива или список элементов, которые должны быть в него записаны.
lock - автоматическая ли синхронизация (содержит ли свой рекурсивный мьютекс). Если указано значение False, то вы сами должны заботится об синхронизации.