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

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

15.05.2020, 09:54. Показов 28326. Ответов 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
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 5
25.05.2020, 14:27
Студворк — интернет-сервис помощи студентам
У меня ещё такая ошибка получаеться

panic: Got 142745 from output channel, should be 83602 [recovered]
panic: Got 142745 from output channel, should be 83602

goroutine 38 [running]:
panic(0x54d080, 0xc82000a990)
/usr/lib/go/src/runtime/panic.go:464 +0x3e6
testing.tRunner.func1(0xc820078090)
/usr/lib/go/src/testing/testing.go:467 +0x192
panic(0x54d080, 0xc82000a990)
/usr/lib/go/src/runtime/panic.go:426 +0x4e9
_/temp/executing.TestSlowSquare(0xc820078090)
/temp/executing/main_test.go:104 +0x61f
testing.tRunner(0xc820078090, 0x64c4f8)
/usr/lib/go/src/testing/testing.go:473 +0x98
created by testing.RunTests
/usr/lib/go/src/testing/testing.go:582 +0x892
make: *** [run] Error 1
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 6
25.05.2020, 17:15
Это значит что ответ на самом деле не тот, что ожидается.
Например, f(x1) == 22, f(x2) == 33, ожидается 55, а Вы передаёте не 55.

У меня подобные ошибки возникали, если специально (для теста) выводить в out случайное число, скажем 12345.

А по поводу задания, у меня как и у других - WA. при этом 0.6 сек и ~50Mb.
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 47
25.05.2020, 17:35
А какой компилятор вы используете? У них написано в письме "Мы ожидаем решение задачи Е на Go. Для отправки решения на Go используй gcc go, gcc golang."

Я попробовал выбрать язык "gcc go" при отправке, но все равно WA :c
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 6
25.05.2020, 17:55
Отправляю, как указано в примечании к заданию - "Отправлять задачу необходимо под компилятором Make."
Под gc go - CE, под gcc go - RE.
0
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
25.05.2020, 18:00
Пробовал такое решение, выдает WA, хотя здесь и включено ожидание получения значений с двух каналов, пока значения не будут полученны, сумма не будет считаться. Что уже не так ума все не приложу
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
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <- chan int, out chan<- int, n int) {
    go func() {
        for i := 0; i < n; i++ {
            var w sync.WaitGroup
 
            w.Add(2)
            x1, x2 := 0, 0
 
            go func(in1 <-chan int) {
                x1 = f(<- in1)
                w.Done()
            }(in1)
 
            go func(in2 <-chan int) {
                x2 = f(<- in2)
                w.Done()
            }(in2)
 
            w.Wait()
 
            out <- x1 + x2
        }
    }()
}
0
25.05.2020, 19:07

Не по теме:

У вас там сессия что ли? Что за наплыв?

0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 5
25.05.2020, 19:16
Я это понял, всякие разные ошибки уже были. Но возвращается сумма f(int) .. я думал может функция ожидает результат в том же порядке в котором она отправляла данные, а приходят в разброс
0
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
25.05.2020, 19:18
korvin_, да это задание на яндекс контесте, я уже просто из принципа хочу добиться верного ответа, почему же мое решение не подходит.
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 5
25.05.2020, 19:20
а F. Сумма двух
у всех верно получилось ? У меня два теста ок а на третьем тесте падает в неверный ответ...
0
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
25.05.2020, 19:22
aoanima, ну там вообще изи, просто задание внимательней прочитай, там может быть до 1000 цифр в одном числе
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
25.05.2020, 21:04
Neko-neko, TL у тебя потому что ты ждёшь пустой канал. По крайней мере разницы с закрытием я не заметил. Сам использовал канал вместо мапы. Похоже что при WA и TL система пишет TL. Уже всё перепробовал, походу WA никак не побороть
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
26.05.2020, 07:08
korvin_, это всё про Ozon объявил о запуске бесплатной школы программирования на Go (на этом форуме видел и решение про SQL-запрос из того же задания ¯\_(ツ)_/¯).

Добавлено через 7 минут
Цитата Сообщение от ColdSkull Посмотреть сообщение
Neko-neko, TL у тебя потому что ты ждёшь пустой канал. По крайней мере разницы с закрытием я не заметил. Сам использовал канал вместо мапы. Похоже что при WA и TL система пишет TL. Уже всё перепробовал, походу WA никак не побороть
ColdSkull,
TL у тебя потому что ты ждёшь пустой канал.
Да вроде не жду: входные каналы читаю отдельными горутинами, каждая считает, сколько прочитано, и завершается, когда достаточно.
А время в отчёте: 2.081s, 2.082s -- выходит за 2 секунды (Память в допустимых пределах: 49-50 Mb).

Почему в мэп, а не в канал: а вдруг f(x_1) выполняется за 1.5 секунды, а f(x_2) - за одну.
Тогда если выполнять по очереди, получится 2.5 секунды, а если параллельно и писать в канал, результаты будут в другом порядке.
0
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
26.05.2020, 07:40
Neko-neko, по моему у них там пиздец какие типы тесты пишут, вчера два идентичных решения выдавали разные ошибки
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 6
26.05.2020, 09:02
Результат компиляции выдаёт одно и то же для WA:

stdout:
'/temp/compiling/source' cannot be extracted via extract ()
/bin/sh ./build.sh


stderr:
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
26.05.2020, 09:11
pve, он всегда это выдаёт.
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
26.05.2020, 10:02
Цитата Сообщение от pve Посмотреть сообщение
Результат компиляции выдаёт одно и то же для WA:
stdout:
'/temp/compiling/source' cannot be extracted via extract ()
/bin/sh ./build.sh
stderr:
Кто-то нашёл объяснение данной ошибки? Просто ни в форумах, ни в каких-то сообществах, данная ошибка не обсуждалась
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
26.05.2020, 11:58
lokilo, сегодня они вообще что-то сломали?

runtime-error,
Stderr:
Code
1
2
3
4
./run.sh: line 1: truein/bash: No such file or directory
can't load package: package .: 
main_test.go:1:1: expected 'package', found 'IDENT' trueage
make: *** [run] Error 1
Что за "trueage"??? ("package", в который вкорячили "true"? У меня этого не было.)

Кстати, организаторы упоминают "подробные и конструктивные комментарии", на которые они отвечают.
Я не заметил, куда их можно слать (кроме как на э-почту).

Ещё интересно, можно ли самому писать в Stderr?
Или туда идёт только выдача их bash-скрипта?
0
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
26.05.2020, 12:54
У вас всех неправильные суммы из-за конкурентного доступа к одной переменной разных горутин.
Используйте для атомарной инкрементации
C
1
atomic.AddInt32(&переменная, насколько_увеличить)
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 6
26.05.2020, 13:29
Цитата Сообщение от Garry Galler Посмотреть сообщение
У вас всех неправильные суммы из-за конкурентного доступа к одной переменной разных горутин.
Используйте для атомарной инкрементации
C
1
atomic.AddInt32(&переменная, насколько_увеличить)
не похоже, что в этом причина
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
26.05.2020, 14:16
Neko-neko, Я имел ввиду что ты ждёшь когда из выходного всё прочитают, потом закрываешь, поэтому TL. Порядок можно сохранить если в канал писать например слайс с результатом и итерацией
Garry Galler, Ты уверен? Проверял решение своё?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.05.2020, 14:16

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

Функция удаления текста в скобках [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()


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru