В Lua нет собственных потоков (упреждающая многозадачность), однако, как вы сказали, кооперативная многозадачность существует.
Разница между упреждающей и совместной многозадачностью заключается в том, что в упреждающей многозадачности «потоки» не обязательно разрешены для запуска до завершения, но могут быть вытеснены другими потоками. Это выполняется планировщиком, который выполняется через равные промежутки времени, переключая один поток на другой. В этом случае приоритеты приходят. Если поток с более высоким приоритетом хочет запустить, он может вытеснить уже запущенный поток с более низким приоритетом, и планировщик будет выбирать этот поток (в зависимости от стратегии планирования), в следующий раз, когда запускается планировщик.
В совместной многозадачности не обязательно должен быть планировщик (хотя по практическим соображениям обычно это хорошая идея иметь его). Однако существуют совместные процессы. Со-процесс похож на поток, за исключением того, что он не может быть выгружен. Он может либо работать до завершения, либо перейти к другому совместному процессу и разрешить его запуск.
Итак, вернитесь к своему вопросу, если вам нужны приоритеты с совместной многозадачностью, вам нужно написать планировщик, который решает, какой совместный процесс запускается с учетом его приоритета, и вам нужно написать свой совместный процесс, чтобы они время от времени отказываться от обработки и возвращать управление планировщику.
Редактировать
Чтобы уточнить, есть небольшая разница между не-вытесняющей многозадачностью и кооперативной многозадачностью. Непрерывная многозадачность немного шире, поскольку она позволяет как статичное планирование, так и совместную многозадачность.
Статическое планирование означает, что планировщик может планировать периодические задачи, которые затем могут выполняться при выполнении задачи, возможно, с более высоким приоритетом.
Совместная многозадачность также является разновидностью неперехваченной многозадачности. Однако здесь задачи планируются только самими задачами, а управление явно передается из задачи в другую, но какая задача, на которую она уступает, может основываться на приоритете.
Ну ладно, чтобы говорить, что все потоки имеют образно одинаковый приоритет. В более ранних версиях Smalltalk также есть многопользовательская неподдерживаемая многозадачность, но более высокий приоритетный поток может прерывать более низкий, в отличие от потоков одного и того же приоритета, которые не могут прерывать друг друга. – OlliP
Нет нитей, поскольку вы знаете их от pthreads, потому что нет планировщика, а это значит, что также нет понятия приоритетов. Задачи кооперативны, что означает, что они уступают друг другу. – jbr
Спасибо за комментарий в разделе «Редактировать». Очень жаль, что нить в Lua не является превентивной.В любом случае, Lua не будет моим любимым языком сценариев. У нас были такие проблемы, чтобы сделать GUI отзывчивым тогда с Smalltalk. Подумайте, я попробую Lua Lanes. Несчастливо, это кажется слишком тяжелым для небольших вещей, которые нужно запускать параллельно. – OlliP