Как уничтожить всех агентов в очереди и вставить новых агентов с условием? - PullRequest
0 голосов
/ 09 мая 2019

По сути, у меня есть простая схема источника / поглотителя на аналогике:

My Model

Источник вставит в мою строку агент "CMproduto" и получит характеристики агента из моей БД. Мой агент будет затем отсортирован по строке, по которой он будет обработан условным объектом в соответствующую очередь (строки 1/2/3), и агенты поочередно выйдут из моей модели через условие. Тем не менее, моя база данных может быть изменена (в соответствии с остальной частью моего моделирования), поэтому мне нужно уничтожить всех текущих агентов во всех 3 очередях (а также из моего населения CMproduto) и повторно вставить их через «источник», но с новым значения из моей обновленной базы данных. Таким образом, моя база данных всегда будет регистрировать старые модели (модели, которые уже отправлены в мой приемник), для этого я создал в моей базе данных столбец, который обновляется на «0» или «1», если агент не выполнял или был обработано соответственно. Поэтому мне следует только повторно вставить в мои агенты моделей, которые имеют значения «0» в этом столбце (я не хочу повторно обрабатывать модели, которые уже были обработаны).

configuration of the source box

Вот так настроен мой источник. В основном агенты будут входить с «временем между прибытием», равным 0 (поэтому все они вставляются в мою модель одновременно). Как уже говорилось, параметры берутся из БД, и количество поступлений ограничено.

Мой вопрос: если я удалю этих агентов из моего "CMproduto", будут ли они автоматически удалены из моих очередей? Кроме того, как я могу повторно вставить агентов в мою модель с характеристиками из моей БД (и только с моделями, которые еще не были обработаны)?

1 Ответ

0 голосов
/ 09 мая 2019

Я бы удалил агентов из очереди и затем отправил бы их обратно через поток через блок ввода. Код будет выглядеть примерно так:

while( queue.size() > 0 ){
  // get the agent out of the queue
  Agent agent = queue.removeFirst();
  // maybe insert some code to adjust the paramters
  // then send back to the enter block
  enter.take( agent );
}

Ваша диаграмма может выглядеть примерно так:

enter image description here

Вы можете использовать agent.deleteSelf () для удаления агента из совокупности, но вы получите ошибку, если он все еще находится в блоке потоковой диаграммы. Кроме того, когда я убираю агентов, я всегда отправляю их в раковину, а не просто убираю их из населения. В прошлом мы замечали, что это помогает с утечками памяти, наряду с очисткой наших собственных ссылок.

Я заметил, что вы просто отправляете агентов в очереди, которые ожидают выполнения некоторых условий (блокировка блокировки). Вы можете рассмотреть блок ожидания (см. Меню справки). Возможно, вы также захотите рассмотреть отдельную очередь, где вы просто вытаскиваете агентов из очереди, когда выполняете условия ... и действительно, если вы просто держите агентов в очереди, вам могут вообще не понадобиться эти блоки - вы может просто хранить агентов в коллекции и добавлять / удалять / сортировать и т. д. по мере необходимости.

...