package main
import (
"bufio"
//"bytes"
"fmt"
//"log"
"os"
"parser/parse"
"time"
)
var storageUrl map[string]int
var storageEmail map[string]int
func main() {
storageUrl = make(map[string]int, 10240)
storageEmail = make(map[string]int)
queueLoadUrl := make(chan string)
queueParseUrlHtml := make(chan string)
//queueParseEmailHtml := make(chan string)
queueStorageUrl := make(chan string)
queueStorageEmail := make(chan string)
defer func() {
if r := recover(); r != nil {
ReplacationFileSystem()
os.Exit(1)
}
}()
for i := 0; i < 10; i++ {
go func() {
for {
msg := <-queueLoadUrl
_, ok := storageUrl[msg]
if !ok {
queueStorageUrl <- msg
queueParseUrlHtml <- parse.LoadUrl(msg)
}
}
}()
//эта рутина занята парсингом
go func() {
for {
msg := <-queueParseUrlHtml
go func() {
//поиск емейлов.
for _, value := range parse.EmailHtml(msg) {
queueStorageEmail <- value
}
//парсим все ссылки и отдаём на загрузку.
//что то вроде рекурсии
for _, value := range parse.UrlHtml(msg) {
queueLoadUrl <- value
}
}()
}
}()
}
//эта рутина обновляет данные в Storage
go func() {
for {
select {
case msg1 := <-queueStorageUrl:
storageUrl[msg1] = 0
case msg2 := <-queueStorageEmail:
_, ok := storageEmail[msg2]
if !ok {
storageEmail[msg2] = 0
}
}
}
}()
//рутина занята репликацией.
reader := bufio.NewReader(os.Stdin)
fmt.Print("Фраза или url: ")
text, _ := reader.ReadString('\n')
fmt.Println("Начал парсинг")
queueLoadUrl <- text
for {
time.Sleep(25000 * time.Millisecond)
ReplacationFileSystem()
}
}
func ReplacationFileSystem() {
file, _ := os.Create("email.txt")
defer file.Close()
var buf string
for key, _ := range storageEmail {
buf += key + "\n"
}
fmt.Println("Распарсенно страниц: ", len(storageUrl), "\nВсего найдено адресов: ", len(storageEmail))
file.WriteString(buf)
}