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

Неблокирующая функция

15.05.2020, 09:54. Показов 27926. Ответов 94
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
у меня задача: написать функцию func test(f func(int) int, in1 <-chan int, in2 <- chan int, out chan<- int, n int) в package main.
она
n раз сделать следующее

1. прочитать по одному числу из каждого из двух каналов in1 и in2, назовем их x1 и x2.
2. вычислить f(x1) + f(x2)
3. записать полученное значение в out
Функция test должна быть неблокирующей, сразу возвращая управление.
Функция f может работать долгое время, ожидая чего-либо или производя вычисления.

Формат ввода
Количество итераций передается через аргумент n.
Целые числа подаются через аргументы-каналы in1 и in2.
Функция для обработки чисел перед сложением передается через аргумент f.

Код на go - вопрос как сделать функцию неблокирующей? в чем у меня ошибка?
еще при сборке ругается cannot be extracted via extract ()

Go
1
2
3
4
5
6
7
8
9
10
11
12
package main
 
// this is a comment
func test(f func(int) int, in1 <-chan int, in2 <- chan int, out chan<- int, n int) {
 
    for i := 0; i < n; i++ {
        var x1 int = <- in1
        var x2 int = <- in2
        var res int = f(x1) + f(x2)
        out <- res
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.05.2020, 09:54
Ответы с готовыми решениями:

Неблокирующая запись в файл
Есть код на perl работающий на Windows, который пишет данные в файл. use warnings; use feature 'say'; open(FH, '&gt;',...

Неблокирующая запись файла
Добавил в программу функцию журналирования своих действий и столкнулся с тем, что пока программа работает, пишет действия в текстовый файл,...

Неблокирующая работа с каналами
Пытаюсь написать программу, крутящуюся в своем цикле и изредка проверяющую входной канал (pipe) на наличие новых данных. Если они есть и их...

94
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
15.05.2020, 11:17
Цитата Сообщение от _FoCuS Посмотреть сообщение
еще при сборке ругается cannot be extracted via extract ()
Нет, не ругается

Добавлено через 4 минуты
Цитата Сообщение от _FoCuS Посмотреть сообщение
как сделать функцию неблокирующей?
https://tour.golang.org/concurrency/1
0
0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 3
18.05.2020, 13:20
_FoCuS, Я так понимаю неблокирующей можно сделать через select {}. А долго время работать наверное с помощью бесконечного цикла
Решили задачу?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
18.05.2020, 14:12
Цитата Сообщение от kashicio Посмотреть сообщение
Я так понимаю неблокирующей можно сделать через select
select здесь не нужен.
0
0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 3
18.05.2020, 14:41
korvin_, Почему? А как обойти блокировку на чтение из каналов in1, in2 ?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
18.05.2020, 15:45
Цитата Сообщение от kashicio Посмотреть сообщение
А как обойти блокировку на чтение из каналов in1, in2 ?
Очевидно использовать горутину.
0
0 / 0 / 0
Регистрация: 18.05.2020
Сообщений: 3
18.05.2020, 16:06
korvin_, Ну здесь требуется в реализации функции сделать её не блокирующей. А горутина определяется перед вызовом функции.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
18.05.2020, 17:49
kashicio, подумай ещё.
0
0 / 0 / 0
Регистрация: 03.05.2020
Сообщений: 1
19.05.2020, 09:24
"kashicio, подумай ещё."

Можно уже сказать ответ?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
19.05.2020, 10:51
Цитата Сообщение от uakmal Посмотреть сообщение
Можно уже сказать ответ?
Конечно можно. Скажи.

Например:
Go
1
2
3
4
5
6
7
8
9
func sum(out chan<- int, xs <-chan int, ys <-chan int, n int, f func(int) int) {
    go func() {
        for i := 0; i < n; i++ {
            x := <- xs
            y := <- ys
            out <- f(x) + f(y)
        }
    }()
}
1
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
19.05.2020, 12:14
Цитата Сообщение от _FoCuS Посмотреть сообщение
Код на go - вопрос как сделать функцию неблокирующей? в чем у меня ошибка?
еще при сборке ругается cannot be extracted via extract ()
Решил эту проблему?
0
0 / 0 / 0
Регистрация: 20.05.2020
Сообщений: 2
20.05.2020, 18:05
вроде все логично, просто и должно работать, однако тестирующая система выдает wrong answer. Откуда здесь неправильный ответ может быть, если надо сумму двух результатов функции надо получить

Добавлено через 5 часов 22 минуты
Коллеги, нет идей, в чем может быть проблема?
Проверяющая система пишет:
panic: Got XXXXX from output channel, should be YYYYY [recovered]
panic: Got XXXXX from output channel, should be YYYYY

откуда может быть неверный ответ, нужно добавлять синхронизацию потоков какую-то?
0
1 / 1 / 1
Регистрация: 24.02.2011
Сообщений: 14
20.05.2020, 18:57
Покажи код, так не понятно. Или у тебя такой же как у ТСа? Судя по ошибке ожидается YYYYY, вместо XXXXX
0
0 / 0 / 0
Регистрация: 20.05.2020
Сообщений: 2
20.05.2020, 19:45
]код пробовал как у Korvin и разные вариации со вложенными go func

Go
1
2
3
4
5
6
7
8
9
func sum(out chan<- int, xs <-chan int, ys <-chan int, n int, f func(int) int) {
    go func() {
        for i := 0; i < n; i++ {
            x := <- xs
            y := <- ys
            out <- f(x) + f(y)
        }
    }()
}
а также с добавлением синхронизации внутри с помощью sync.WaitGroup
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <- chan int, out chan<- int, n int) {
    go func() { 
    var wg sync.WaitGroup
    for i := 0; i < n; i++ {
        wg.Add(1)
        go func() { 
                x1 := <- in1
                x2 := <- in2
                x3 := f(x1) + f(x2)
                out <- x3
        }()
        wg.Wait()
    }
    }()
}
Понятно, что код выдает значение, не совпадающее с тем, что ожидает проверяющая система, вопрос в том откуда тут может быть ошибка?

Добавлено через 4 минуты
Второй пример кода неверно скопировал, должно быть вот так, например:

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <- chan int, out chan<- int, n int) {
    go func() { 
    var wg sync.WaitGroup
    for i := 0; i < n; i++ {
        wg.Add(1)
        go func() { 
                x1 := <- in1
                x2 := <- in2
                        x3 := f(x1) + f(x2)
                out <- x3
        }()
    }
    wg.Wait()
    }()
}
0
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 2
23.05.2020, 12:25
Привет, ну что у кого-то получилось? Я пытался делать различные вариации на такую тему, пытаясь добавлять проверки на различные граничные условия, но безуспешно. Если кто смог найти решение можно хоть подсказочку на чем ломаться может?) А то уже не первый день пытаюсь:
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <-chan int, out chan int, n int) {
    go func() {
        defer close(out)
        for i := 0; i < n; i++ {
            select {
            case a := <-in1:
                out <- (f(a) + f(<-in2))
            case b := <-in2:
                out <- (f(b) + f(<-in1))
            default:
            }
        }
    }()
}
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
23.05.2020, 15:11
Аналогичная ситуация, пробовал по всякому. Не хочет принимать и всё тут.
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
25.05.2020, 01:42
Вообще в условии не сказано, что каналы готовы поставлять числа моментально
Может быть первый канал успевает поставить два числа, пока второй не поставил ни одного?
Если каналы не буфиризируемые, то в зависимости от того, что у них там в main(), программа может крашиться
Я сделать пять отдельный горутин (две считывают числа из каналов и перекидывают из в буферицируемые каналы, еще две параллельно высчитывают функцию f() для двух чисел, и еще одна принимает результаты, суммирует и направляет в out
Ничего не получается всё равно, wrong answer через 0.6с после начала. Значит дело не в этом...


@Carramba
select делает только то, что если при попытке считать числа из канала его там нет, то вместо этого отрабатывает default
то есть у тебя цикл работает вхолостую и очень быстро вырабатывает все i < n

@Gorodok
у тебя нигде нет wg.Done(), будет ждать бесконечно. Но вообще я так и не придумал зачем там WaitGroup
ещё ты создаёшь n горутин, которые все одновремено пытаются считать числа из входящих потоков. Мне кажется, бардак неизбежен

Да, go весёлый язык
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
25.05.2020, 11:01
А вот ещё интересно: f() -- "чистая" функция?
Можно ли уверенно сохранять вычисленные результаты, чтобы не вычислять для того же икс несколько раз (раз уж она может долго считаться)?
(У меня были уже результаты WA, TL и RE, "вроде должно быть правильно, но...". )
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
25.05.2020, 11:48
@mplain тоже так делал, не помогало. Медленные решения получают вердикт Idleness Limit, а у нас WA так что думаю копать сюда смысла нет. Если краш - то было бы RE наверное.
@Neko-neko Хорошая идея с чистой функцией, но по мне маловероятно. Сохранять тоже смысла нет, у нас не IL
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
25.05.2020, 12:20
ColdSkull, я пробовал с и без -- у меня всё равно "TL" (time-limit-exceeded) (почему-то не IL)
(сохранял параллельно вычисленные f(x) в хэшмэпах с мьютексом ¯\_(ツ)_/¯).

Добавлено через 8 минут
Ещё интересно: надо ли закрывать выходной канал после выдачи всех чисел?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2020, 12:20
Помогаю со студенческими работами здесь

Функция поиска в массиве и указатели + функция сортировки и поиск найденного элемента
Написать функцию поиска максимального элемента, передать в неё указатель на начало и конец поиска и возвращать указатель на найденный...

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой нужно удалить весь текст в скобках,...

Функция sqrt: существует более одного экземпляра. Функция перегруженная
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ float s, p; int c, a; s=0; ...

Перегрузка операций: friend-функция или функция-член класса
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()?
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru