您似乎希望使处理器不会落后于蜘蛛太远。我想你也希望能够扩大规模。
我的建议是使用客户端/服务器 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 台计算机上运行,队列都将提供您需要的控制,以确保所有部分同步,并且不会彼此领先太远。