В моем веб-сканере у меня есть класс, который отслеживает URL для сканирования, удаления дубликатов и т. Д.
clerk = VisitOnlyOnceClerk()
clerk.enqueue(starting_point, starting_point)
for (url, referer) in clerk:
# get the url, and clerk.enqueue() all the links from it ...
Это похоже на задачу, которую может выполнить сопрограмма.Я видел примеры сопрограмм, которые только производят значения, и примеры, которые исключительно потребляют значения, но ни один, который делает оба.Что-то вроде:
def visit_once_clerk():
visited = set()
to_visit = set([(yield)])
for i in to_visit:
visited.add(i[1])
extras = (yield i)
if extras:
to_visit.union(i for i in extras if i[1] not in visited)
Это, конечно, не работает так, как мне кажется.Являются ли сопрограммы даже правильным инструментом здесь?Как правильно их использовать в этом случае?