Потоки
Emacs Lisp предоставляет ограниченную форму параллелизма, называемую потоками. Все потоки в данном экземпляре Emacs используют общую память. Параллелизм в Emacs Lisp «в основном кооперативный»: это означает, что Emacs переключает выполнение между потоками только в определённые моменты. Однако поддержка потоков в Emacs спроектирована так, чтобы в дальнейшем обеспечить более гибкий параллелизм, поэтому корректные программы не должны полагаться на кооперативную многопоточность.
В настоящее время переключение между потоками происходит по явному запросу с помощью thread-yield, при ожидании ввода с клавиатуры или вывода процесса от асинхронных процессов (например, во время accept-process-output), а также при блокирующих операциях, связанных с потоками, таких как блокировка мьютекса или thread-join.
Emacs Lisp предоставляет примитивы для создания потоков и управления ими, а также для создания мьютексов и условных переменных и управления ими; они полезны для синхронизации потоков.
Глобальные переменные являются общими для всех потоков Emacs Lisp, а локальные переменные — нет: динамическая привязка let является локальной. У каждого потока также есть собственный текущий буфер (см. Текущий буфер) и собственные данные совпадений (см. Данные совпадений).
Обратите внимание, что привязки let обрабатываются реализацией Emacs Lisp особым образом. Воспроизвести такое поведение свёртывания и восстановления привязок можно только с помощью let. Например, ручная реализация let, написанная с использованием unwind-protect, не может обеспечить отдельные значения переменных для каждого потока.
В случае лексических привязок (см. Правила области видимости привязок переменных) замыкание является таким же объектом, как и любой другой объект в Emacs Lisp, а привязки в замыкании являются общими для всех потоков, вызывающих это замыкание.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Threads.html