Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358

Сложность с решением задачки

24.05.2024, 22:18. Показов 653. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте. Никак не получается заставить работать следующий код:
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main
 
import (
    "fmt"
    "time"
)
 
type Ttype struct {
    id         int
    cT         string // время создания
    fT         string // время выполнения
    taskRESULT []byte
}
 
func main() {
    taskCreturer := func(a chan Ttype) {
        go func() {
            for {
                ft := time.Now().Format(time.RFC3339)
                if time.Now().Nanosecond()%2 > 0 { // условие появления ошибочных тасков
                    ft = "Some error occured"
                }
                a <- Ttype{cT: ft, id: int(time.Now().Unix())} // передаем таск на выполнение
            }
        }()
    }
 
    superChan := make(chan Ttype, 10)
 
    go taskCreturer(superChan)
 
    task_worker := func(a Ttype) Ttype {
        tt, _ := time.Parse(time.RFC3339, a.cT)
 
        if tt.After(time.Now().Add(-20 * time.Second)) {
            a.taskRESULT = []byte("task has been successed")
        } else {
            a.taskRESULT = []byte("something went wrong")
        }
 
        a.fT = time.Now().Format(time.RFC3339Nano)
 
        time.Sleep(time.Millisecond * 150)
 
        return a
    }
 
    doneTasks := make(chan Ttype)
    undoneTasks := make(chan error)
 
    tasksorter := func(t Ttype) {
        if string(t.taskRESULT[14:]) == "successed" {
            doneTasks <- t
        } else {
            undoneTasks <- fmt.Errorf("Task id %d time %s, error %s", t.id, t.cT, t.taskRESULT)
        }
    }
 
    go func() {
        // получение тасков
        for t := range superChan {
            t = task_worker(t)
            go tasksorter(t)
        }
 
        close(superChan)
    }()
 
    result := map[int]Ttype{}
    err := []error{}
 
    go func() {
        for r := range doneTasks {
            go func() {
                result[r.id] = r
            }()
        }
 
        for r := range undoneTasks {
            go func() {
                err = append(err, r)
            }()
        }
 
        close(doneTasks)
        close(undoneTasks)
    }()
 
    time.Sleep(time.Second * 3)
 
    println("Errors:")
    for r := range err {
        println(r)
    }
 
    println("Done tasks:")
    for r := range result {
        println(r)
    }
}
Приложение эмулирует получение и обработку неких тасков. Пытается и получать, и обрабатывать в многопоточном режиме.
После обработки тасков в течении 3 секунд приложение должно выводить накопленные к этому моменту успешные таски и отдельно ошибки обработки тасков.
Есть несколько условий, которые должны быть выполнены:
- сохранить логику появления ошибочных тасков;
- оставить асинхронные генерацию и обработку тасков;
- сделать правильную мультипоточность обработки заданий.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2024, 22:18
Ответы с готовыми решениями:

задачки с решением по массиву
всем привет, помогите разобраться с задачами. Никак не пойму, что тут, тема массив П.5.18.Правил Запрещено размещать задания и...

Прошу помощи с решением задачки
Доброго времени суток! Меня зовут Света, мне 26 и я абсолютно ничего не понимаю в электронике. :ghide: Мы вместе с моим папой делаем...

Не могу разобраться с решением задачки
Добрый вечер встретилась задача в книге вот её описание: Великие фокусники: начните с копии вашей программы из упражнения 8-9 Напишите ...

1
64 / 55 / 30
Регистрация: 30.12.2015
Сообщений: 166
26.05.2024, 03:51
Лучший ответ Сообщение было отмечено asdfg15432 как решение

Решение

Вот что-то типо такого, должно работать, и мне лень расписывать, что конкретно у вас не так (спойлер, всё)

Единственное что, с таким условием все таски будут успешно выполнены (ну как минимум у меня так, может если дольше подождать, то и будет что-то)

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
type task struct {
    id         int
    dateCreate time.Time // время создания
    endDate    string    // время выполнения
    err        error
    taskRESULT []byte
}
 
func (t *task) String() string {
    return fmt.Sprintf("id %v;dateCreate %v;endDate %v;taskRESULT %v",
        t.id,
        t.dateCreate.Format(time.RFC3339),
        t.endDate,
        string(t.taskRESULT),
    )
}
 
type results struct {
    *sync.Mutex
    doneTasks   []*task
    undoneTasks []*task
}
 
func newResults() *results {
    return &results{
        Mutex:       &sync.Mutex{},
        doneTasks:   make([]*task, 0),
        undoneTasks: make([]*task, 0),
    }
}
 
func (t *task) doSomeShit() *task {
    if t.err == nil {
        t.taskRESULT = []byte("task has been success")
    } else {
        t.taskRESULT = []byte("something went wrong")
    }
    t.endDate = time.Now().Format(time.RFC3339Nano)
 
    time.Sleep(time.Millisecond * 150)
    return t
}
 
func main() {
    resChan := make(chan *task)
    workChan := make(chan *task)
    res := newResults()
    go resultWaiter(res, resChan)
    go worker(workChan, resChan)
    go fillWorker(workChan)
    for {
        time.Sleep(3 * time.Second)
        fmt.Println("Errors:")
        res.Mutex.Lock()
        for _, undoneTask := range res.undoneTasks {
            fmt.Println(undoneTask.String())
        }
        fmt.Println("Done tasks:")
        for _, doneTask := range res.doneTasks {
            fmt.Println(doneTask.String())
        }
        res.Mutex.Unlock()
    }
}
 
func worker(workChan, resChan chan *task) {
    for {
        select {
        case task := <-workChan:
            resChan <- task.doSomeShit()
        }
 
    }
}
 
func resultWaiter(res *results, resChan chan *task) {
    for {
        select {
        case task := <-resChan:
            res.Mutex.Lock()
            if task.err != nil {
                res.undoneTasks = append(res.undoneTasks, task)
                res.Mutex.Unlock()
                continue
            }
            res.doneTasks = append(res.doneTasks, task)
            res.Mutex.Unlock()
        }
 
    }
}
 
func fillWorker(workChan chan *task) {
    for {
        var err error
        if time.Now().Nanosecond()%2 > 0 { // условие появления ошибочных тасков
            err = fmt.Errorf("some error")
        }
        workChan <- &task{
            id:         int(time.Now().Unix()),
            dateCreate: time.Now(),
            endDate:    "",
            err:        err,
            taskRESULT: nil,
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2024, 03:51
Помогаю со студенческими работами здесь

Помогите с решением задачки на препроцессоры. С++
Условие:

Проблемка с решением задачки: три вектора
Определите углы между тремя векторами, направленными из общей начальной точки с координатами (0,0) в конечные точки:точку (2;5);...

не как не разберусь с решением простенькой задачки
Постройте блок-схему решения поисковой задачи: среди трёх автомобилей найти автомобиль синего цвета, номер которого заканчивается цифрами...

Люди добрые! Поспособствуйте с решением задачки пожалуйста
Доброго времени суток Уважаемые форумчане. По долгу службы(учёбы) встретилась задачка: Сформировать очередь, содержащую в качестве...

Временная сложность в С#. Как выразить временную сложность Θ метода A через n?
static void Do(int n) { B(A(n)); } static List&lt;int&gt; A(int n) { var values = new List&lt;int&gt;(); for (var i = 0; i &lt; n;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru