Похоже, что вы хотите, чтобы процессоры не отставали слишком далеко от пауков. Я полагаю, что вы хотите иметь возможность масштабировать и это.
Моя рекомендация состоит в том, чтобы реализовать очередь, используя клиентскую / SQL-базу данных SQL. MySQL отлично подойдет для этой цели.
Цели проектирования
- Не позволяйте паукам слишком сильно опережать процессоры
- Обеспечить баланс сил между пауками и процессорами (каждый занят)
- Сохраняйте данные как можно более свежими
- Масштабирование и увеличение по мере необходимости
Очередь:
Создайте очередь для хранения данных от пауков до их обработки. Это можно сделать несколькими способами, но это не звучит так, будто IO - это ваше узкое место.
Простым подходом было бы иметь таблицу SQL с таким макетом:
TABLE Queue
Queue_ID int unsigned not null auto_increment primary key
CreateDate datetime not null
Status enum ('New', 'Processing')
Data blob not null
# pseudo code
function get_from_queue()
# in SQL
START TRANSACTION;
SELECT Queue_ID, Data FROM Queue WHERE Status = 'New' LIMIT 1 FOR UPDATE;
UPDATE Queue SET Status = 'Processing' WHERE Queue_ID = (from above)
COMMIT
# end sql
return Data# or false in the case of no records found
# pseudo code
function count_from_queue()
# in SQL
SELECT COUNT(*) FROM Queue WHERE Status = 'New'
# end sql
return (the count)
Паук:
Итак, у вас есть несколько процессов паука .. Каждый из них говорит:
if count_from_queue() < 10:
# do the spider thing
# save it in the queue
else:
# sleep awhile
repeat
Таким образом, каждый паук будет либо отдыхать , либо паук . Решение (в данном случае) основано на том, что для обработки осталось менее 10 ожидающих пунктов. Вы бы настроили это на ваши цели.
Процессор
Итак, у вас есть несколько процессорных процессов .. Каждый из них говорит:
Data = get_from_queue()
if Data:
# process it
# remove it from the queue
else:
# sleep awhile
repeat
Таким образом, каждый процессор будет либо отдыхать , либо обрабатывать .
В итоге:
Независимо от того, выполняется ли это на одном компьютере или на 20, очередь обеспечит необходимый контроль, чтобы обеспечить синхронизацию всех частей и не слишком сильно опережать друг друга.