Я пытаюсь синхронизировать особую проблему производителя / потребителя.Это проблема:
У меня есть 2 очереди link_queue, page_queue
.
Thread class ProducePages_RequireLinks
(назовите это class A
), как следует из названия, потребляет элементы из link_queue
ипомещает произвольное количество (> = 1) страниц из каждой ссылки в page_queue
.
Наоборот, основной поток class ProduceLinks_RequirePages
(назовите его class B
) потребляет страницы из page_queue
и ставит в очередьпроизвольное количество (> = 0) ссылок в link_queue
.
Теперь возможно, что class B
генерирует ссылки быстрее, чем class A
генерирует страницы.С другой стороны, возможно и обратное.
Как правильно синхронизировать эти потоки в Ruby 1.9.2?
Я пыталсяиспользовать мониторы в обоих, но в какой-то момент я получаю взаимоблокировки.
(Если я не смог быть точным, сообщите мне через комментарии, и я отправлю несколько примеров классов)
РЕДАКТИРОВАТЬ: Изображение того, что происходит:
Примеры
link_queue
инициализируется с 1 элемента page_queue
инициализируетсяс 0 элементами
У нас есть 4 темы class A
и 1 тема class B
.Каждая строка будет иметь 1 шаг.
Темы A.1 получают 1 ссылку (linkQ = 0), выводят 1 страницу (pageQ = 1)
Тема B захватывает 1 страницу (pageQ =0) выводит 400 ссылок (linkQ = 400)
Тема A.3 захватывает 1 ссылку (linkQ = 399) выводит 1 страницу (pageQ = 1)
Тема A.2 захватывает 1 ссылку (linkQ = 398) выводит 1 страницу (pageQ = 2)
Тема B захватывает 1 страницу (pageQ = 1) выводит 100 ссылок (linkQ = 498)
Тема A.1 захватывает 1 ссылку (linkQ = 497) выводит 1 страницу (pageQ = 2)
Тема A.4 захватывает 1 ссылку (linkQ = 496) выводит 1 страницу (pageQ = 3)
Тема B замечает, что linkQ являетсяслишком велик и ждет, пока ссылка Q <16 </p>
.,,Темы А. * продолжить работу.,,потом (linkQ = 15) и (pageQ = 484)
А теперь у нас противоположная проблема.Теперь потоки A должны ждать, пока pageQ опустится ниже определенного порога.В противном случае у нас закончится память в какой-то момент.
cheers