LINUX.ORG.RU

История изменений

Исправление DRVTiny, (текущая версия) :

Интересно, как ты видишь удаление из середины вектора/списка, если это удаление реализуется в асинхронных обработчиках.

Смотри:

0) Мы находимся внутри асинхронного коллбека (вызван таймером)

1) Мы пытается отправлять задания из очереди, начиная со «старейшего»

2) Для этого мы используем асинхронный вызов «опубликуй сообщение» с callback'ом, так что callback замыкает в себе переменную - идентификатор задания

3) Внутри callback'а: удаляем задание из списка, если, судя по коду возврата, оно наконец успешно отправилось.

Так вот, как удалить splice'ом? Сейчас я использую для очереди хеш с ключами вида «метка времени из Time::HiRes::time()».«int(rand(10000))» - это гарантирует корректность delete($queUnPub{$key}). Но при этом не даёт легко и быстро регулировать количество элементов в хеше.

По-моему никак: единственный вариант был бы: породить кучу асинхронных вызовов, после чего заснуть, ожидая завершения их всех. В принципе возможно - в том же Mojo::IOLoop::Delay вполне себе можно сделать wait. Вопрос только в том, что происходит во время этого wait'а... Если это блокировка, то я лучше застрелюсь, чем так сделаю когда-либо. Если же это просто передача управления другим обработчикам до тех пор, пока всё порожденное IOLoop::Delay'ем не завершится - тогда можно в каждом callback'е запушить индекс удаляемого элемента в некий вектор, а после wait - сделать splice по всем соотв. элементам. Печально только то, что так легко попасть в ситуацию гонки: очень плохо, когда элементы идентифицируются только индексом в массиве, так легко удалить что-то совсем не то.

Исправление DRVTiny, :

Интересно, как ты видишь удаление из середины вектора/списка, если это удаление реализуется в асинхронных обработчиках.

Смотри:

1) Мы пытается отправить задание из очереди

2) Для этого используем асинхронный вызов с callback'ом

3) Внутри callback'а: удаляем задание из списка, если оно успешно отправилось.

Так вот, как удалить splice'ом? Сейчас я использую для очереди хеш с ключами вида «метка времени из Time::HiRes::time()».«int(rand(10000))» - это гарантирует корректность delete($queUnPub{$key}).

По-моему никак: единственный вариант был бы: породить кучу асинхронных вызовов, после чего заснуть, ожидая завершения их всех. В принципе возможно - в том же Mojo::IOLoop::Delay вполне себе можно сделать wait. Вопрос только в том, что происходит во время этого wait'а... Если это блокировка, то я лучше застрелюсь, чем так сделаю когда-либо. Если же это просто передача управления другим обработчикам до тех пор, пока всё порожденное IOLoop::Delay'ем не завершится - тогда можно в каждом callback'е запушить индекс удаляемого элемента в некий вектор, а после wait - сделать splice по всем соотв. элементам. Печально только то, что так легко попасть в ситуацию гонки: очень плохо, когда элементы идентифицируются только индексом в массиве, так легко удалить что-то совсем не то.

Исходная версия DRVTiny, :

Интересно, как ты видишь удаление из середины вектора/списка, если это удаление реализуется в асинхронных обработчиках.

Смотри:

1) Мы пытается отправить задание из очереди

2) Для этого используем асинхронный вызов с callback'ом

2) Внутри callback'а: удаляем задание из списка, если оно успешно отправилось.

Так вот, как удалить splice'ом?

По-моему никак: единственный вариант был бы: породить кучу асинхронных вызовов, после чего заснуть, ожидая завершения их всех. В принципе возможно - в том же Mojo::IOLoop::Delay вполне себе можно сделать wait. Вопрос только в том, что происходит во время этого wait'а... Если это блокировка, то я лучше застрелюсь, чем так сделаю когда-либо. Если же это просто передача управления другим обработчикам до тех пор, пока всё порожденное IOLoop::Delay'ем не завершится - тогда можно в каждом callback'е запушить индекс удаляемого элемента в некий вектор, а после wait - сделать splice по всем соотв. элементам. Печально только то, что так легко попасть в ситуацию гонки: очень плохо, когда элементы идентифицируются только индексом в массиве, так легко удалить что-то совсем не то.