【发布时间】:2019-09-10 12:15:20
【问题描述】:
我正在尝试实现一个爬虫,它访问某个 URL,从中收集新的相对 URL 并构建一个报告。我正在尝试同时使用 Crystal 光纤和通道,如下所示:
urls = [...] # of String
visited_urls = []
pool_size.times do
spawn do
loop do
url = urls.shift?
break if url.nil?
channel.send(url) if some_condition
end
end
end
# TODO: here the problem!
loop do
url = channel.receive?
break if url.nil? || channel.closed?
visited_urls << url
end
puts visited_urls.inspect
但是在这里我有一个问题 - 无限秒 loop(它调用 channel.receive? 直到频道中的最后一个项目,然后等待一条永远不会到达的新消息)。存在问题是因为我不知道频道中实际有多少项目,所以我不能像 Crystal lang 指南的 Concurency 部分中建议的那样做。
所以,当我们不知道它会存储多少物品并且我们需要接收多少物品时,也许有一些好的做法如何与渠道合作?谢谢!
【问题讨论】: