Erlang Queue проблемы - PullRequest
       3

Erlang Queue проблемы

2 голосов
/ 04 декабря 2010

Я использую API очереди и столкнулся с ошибками, которые приводили к сбою моей программы.

Сначала я выбираю очередь из словаря, который возвращает ее в распечатке

Выбранная очередь [{[], []}]

Это нормально?Правильно ли создана очередь?

Затем, когда я пытаюсь добавить в очередь или получить ее длину, я получаю ошибку badargs на обоих.

TorrentDownloadQueue = dict:fetch(torrentDownloadQueue, State),
io:format("The fetched queue is  ~p~n", [dict:fetch(torrentDownloadQueue, State)]),
% Add the item to the front of the queue (main torrent upload queue)
TorrentDownloadQueue2 = queue:in_r(Time, TorrentDownloadQueue),
% Get the lenght of the downloadQueue
TorrentDownloadQueueLength = queue:len(TorrentDownloadQueue2),

Когда я пытаюсь вставить значение 10ошибка:

** Причина прекращения == ** {badarg, [{queue, in_r, [10, [{[], []}]]}, {ph_speed_calculator, handle_cast,2}, {gen_server, handle_msg, 5}, {proc_lib, init_p_do_apply, 3}]} ** исключение: ошибка в очереди функций: in_r / 2 вызывается как очередь: in_r (10, [{[], []}]) при вызове из ph_speed_calculator: handle_cast / 2 при вызове из gen_server: handle_msg / 5 при вызове из proc_lib: init_p_do_apply / 3 13>

Это ошибка для in_r, но я получаю ошибку badargsдля звонка Лен тоже.

Что плохого в том, как я их называю, или неправильная начальная очередь?Я создаю очередь следующим образом и добавляю ее в словарь

TorrentDownloadQueue = queue:new(),
TorrentUploadQueue = queue:new(),
D4 = dict:store(torrentDownloadQueue, [TorrentDownloadQueue], D3),
D5 = dict:store(torrentUploadQueue, [TorrentUploadQueue], D4),

Понятия не имею, что я делаю неправильно.

Ответы [ 2 ]

6 голосов
/ 04 декабря 2010

То, что у вас есть ([{[],[]}]) - это очередь в списке. Стандартная очередь выглядит как {list(), list()}. Очевидно, что из-за этого каждый последующий вызов очередей будет неудачным.

Полагаю, вы либо неправильно переносите свою очередь, либо неправильно ее извлекаете.

2 голосов
/ 04 декабря 2010

Прежде всего, у вас есть ошибка "badarg". Чтение из документации для очередей Erlang:

Все функции не работают по причине badarg если аргументы имеют неправильный тип, для аргументы очереди примера не очереди, индексы не являются целыми числами, список аргументы не списки. неподходящий списки вызывают внутренние сбои. Индекс вне диапазона для очереди также вызывает неудача с причиной badarg.

В вашем случае то, что вы передаете в очередь: in_r - это не очередь, а список, содержащий очередь.

Вы добавляете список, содержащий очередь в словарь, когда делаете:

D4 = dict:store(torrentDownloadQueue, [TorrentDownloadQueue], D3),
D5 = dict:store(torrentUploadQueue, [TorrentUploadQueue], D4),

Вместо этого вы должны просто:

D4 = dict:store(torrentDownloadQueue, TorrentDownloadQueue, D3),
D5 = dict:store(torrentUploadQueue, TorrentUploadQueue, D4),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...