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

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

15.05.2020, 09:54. Показов 28320. Ответов 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
Сообщений: 12
27.05.2020, 00:22
Студворк — интернет-сервис помощи студентам
Joker5555
Или можно вместо структуры завести дополнительные каналы с буфером n, обсуждалось уже такое

Мне только непонятно, где здесь может быть гонка по считыванию? считыванию чего, какой переменной?
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 00:28
Цитата Сообщение от mplain Посмотреть сообщение
Или можно вместо структуры завести дополнительные каналы с буфером n, обсуждалось уже такое
насчёт каналов я не особо уловил мысль, мы туда поочерёдно класть будем или результат?

Добавлено через 3 минуты
Цитата Сообщение от mplain Посмотреть сообщение
Мне только непонятно, где здесь может быть гонка по считыванию? считыванию чего, какой переменной?
не совсем точно сказал, не гонка, а результаты у нас скорее всего могут лежать не в верном порядке, поэтому надо либо хранить в условной структуре или мапе, запоминая номер посылки
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 00:31
Я подумал, что ошибки могут возникать, потому что каналы in1, in2, out не имеют буфера и забиваются, поэтому сделал вот так:

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
 
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <-chan int, out chan<- int, n int) {
    loop := func(f func()) { for i := 0; i < n; i++ { f() } }
    in1buffer := make(chan int, n)
    in2buffer := make(chan int, n)
    out1buffer := make(chan int, n)
    out2buffer := make(chan int, n)
    go loop(func() { out <- <-out1buffer + <-out2buffer })
    go loop(func() { out1buffer <- f(<-in1buffer) })
    go loop(func() { out2buffer <- f(<-in2buffer) })
    go loop(func() { in1buffer <- <-in1 })
    go loop(func() { in2buffer <- <-in2 })
}
то есть создаём четыре новых канала с буфером в n элементов каждый, и пять горутин:
- две получают значения из in1 и in2 по мере поступления и направляют в каналы с буфером
- еще две параллельно вычисляют f(x1) и f(x2), на случай если функция высчитывается долго (но при условии что она stateless)
- пятая горутина получает итоговое значение и направляет его в out

всё это сделано на случай если хитрость задачи в том что каналы забиваются, пока f() высчитывается
но это всё ерунда, из входящих каналов все числа поступают без задержек

если попытаться передать в out неверное значение (например произвольное), получаешь вполне конкретную ошибку panic: вы передали значение 12345, а нужно 67890
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 00:35
Цитата Сообщение от mplain Посмотреть сообщение
всё это сделано на случай если хитрость задачи в том что каналы забиваются, пока f() высчитывается
но это всё ерунда, из входящих каналов все числа поступают без задержек
вот наверное в том и суть, что мы вычисляем параллельно f() и может быть происходит так, что в out записываются разные суммы пар, т.е надо как-то перехватывать f(x1) и f(x2) на выходе.
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 00:38
так нет никакой разницы по факту, считаешь ты f() параллельно или последовательно - результат одинаковый
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 00:44
Цитата Сообщение от mplain Посмотреть сообщение
так нет никакой разницы по факту, считаешь ты f() параллельно или последовательно - результат одинаковый
panic: Got 142820 from output channel, should be 83602 [recovered]
panic: Got 142820 from output channel, should be 83602
да вот нет, это результат последовательного выполнения

func Merge2Channels(f func(int) int, in1 <-chan int, in2 <-chan int, out chan<- int, n int) {
x := 0
y := 0
for i := 0; i < n; i++ {
go func() {
out <- f(x) + f(y)
}()
x = <-in1
y = <-in2
}
}

По сути это и есть WA, с конкретным тестом. Просто RE срабатывает из-за тестирующей системы
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 00:48
У меня вот последовательное вычисление, и оно паник не выдаёт, только wrong answer

Go
1
2
3
4
5
6
7
8
9
package main
 
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++ {
            out <- f(<-in1) + f(<-in2)
        }
    }()
}
Кстати, на Я.контесте новое объявление жюри. В нём они сказали, что описание задач у них нормальное, просто решение у нас неправильно. Еще сказали, что спалили этот форум, мы читеры, а решения, здесь опублиокванные, не будут засчитываться
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 00:49
Цитата Сообщение от mplain Посмотреть сообщение
Кстати, на Я.контесте новое объявление жюри. В нём они сказали, что описание задач у них нормальное, просто решение у нас неправильно. Еще сказали, что спалили этот форум, мы читеры, а решения, здесь опублиокванные, не будут засчитываться
точнее будут ревьюрится по видеосвязи
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 00:49
Code
1
2
for i := 0; i < n; i++ {
go func() {
так ты здесь создаёшь n горутин, вот они-то у тебя и вступают в гонку
я создаю одну горутину, которая всё делает последовательно
0
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
27.05.2020, 05:37
korvin_, WA - неверный ответ, но моему мнению, наебашили они охрененные тесты, которые хрен пойми, как работают
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 11:23
Цитата Сообщение от mplain Посмотреть сообщение
Кстати, на Я.контесте новое объявление жюри. В нём они сказали, что описание задач у них нормальное, просто решение у нас неправильно. Еще сказали, что спалили этот форум, мы читеры, а решения, здесь опублиокванные, не будут засчитываться
Ага, ещё сказали, что погорячились с ограничениями для задачи F, добавили полсекунды времени.
(Интересно, что на это скажут те, кто и в секунду укладывался...)
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
27.05.2020, 12:02
Neko-neko, Действительно, лучше бы для Е тесты исправили. Непонятно что ему не нравится. Судя по отзывам тест на это задание в принципе не проходит, даже если оно корректно. Фиксить не будут, если боятся потерять результаты, непонятно почему бы просто не добавить ещё одно исправленное задание и засчитывать решение любого из них
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 12:23
Цитата Сообщение от ColdSkull Посмотреть сообщение
Фиксить не будут, если боятся потерять результаты, непонятно почему бы просто не добавить ещё одно исправленное задание и засчитывать решение любого из них
Наверное там с данными что-то не ладное, и я предполагаю, что возможно надо как-то обходить это
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 12:35
Я их послание понял так, что всё-таки у нас неправильное решение, чего-то мы не учли

Code
1
До момента написания чит-скрипта нами было получено 32 корректных решения этой задачи.
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 12:39
Цитата Сообщение от mplain Посмотреть сообщение
Я их послание понял так, что всё-таки у нас неправильное решение, чего-то мы не учли
ну лично я не видел, чтобы кто-то обрабатывал, если каналы пусты. То есть там каналы в тестирующей системе не буферизированы кажется. И данные могут поступать абсолютно в странном порядке.
0
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
27.05.2020, 12:54
Joker5555, Данные и функция - инты, тут ничего не придумать, иначе RE. Вполне определённый порядок, вычитал один, вычитал другой, записал, с этим тоже проблем нет.
mplain, Очень сомневаюсь, но это мы узнаем только по итогу, если они опубликуют решение, конечно Если что-то не учли, то напишите что? Как можно писать код вслепую без требований?
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 13:12
Цитата Сообщение от mplain Посмотреть сообщение
До момента написания чит-скрипта нами было получено 32 корректных решения этой задачи.
От 3931 человека. Кажется, задача оказалась не самая простая :)
Почти идеальная, чтобы осталось 40, которых они готовы обучать.
С другой стороны: тех, кто её решил, уже учить нечему, можно уже сразу брать на работу :)))

Добавлено через 1 минуту
Цитата Сообщение от ColdSkull Посмотреть сообщение
Как можно писать код вслепую без требований?
"Добро пожаловать в реальный мир!"? ¯\_(ツ)_/¯

("Ну пишем же...")
0
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
27.05.2020, 13:13
Цитата Сообщение от Neko-neko Посмотреть сообщение
С другой стороны: тех, кто её решил, уже учить нечему, можно уже сразу брать на работу ))
может это они есть, составители задач и сотрудники
0
0 / 0 / 0
Регистрация: 27.05.2020
Сообщений: 4
27.05.2020, 18:59
Цитата Сообщение от Neko-neko Посмотреть сообщение
Интересно, что на это скажут те, кто и в секунду укладывался..
Мой результат
F PHP 7.3.5 OK - 285ms 2.00Mb

В Послании так же писали, что в сети есть решение, которые считаются читерскими, по имени функции гуглится гитхаб, там что-то похожее на правду, но не запускал, чтобы не стать читером =)
Смотрите сами.

Выводил данные по Merge2Channels в stderr:
да, там 30 итераций
x1, насколько помню начитнается с 9, потом ++1
x2, начитается где-то между 250-270, потом ++3
данные поступают ровно, без задержек
fx() не тормозит
Merge2Channels запускается 2 раза

Все по памяти, хз как посмотреть старые варианты отравок.

Потратил, 70 попыток, запарился, сдаюсь =)

Когда, кажется, что все правильно вот такая ошибка

C
1
2
3
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
goroutine 9 [chan receive]:
Я столько горутин не создаю, значит это не мои горутины зависают, а что с этим делать хз.

Добавлено через 10 минут
добавлю, если результат писать в stderr, то все идет своим чередом
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
27.05.2020, 19:49
Code
1
fatal error: all goroutines are asleep - deadlock!
эта ошибка возникает в частности если передать слишком мало значений в out
канал продолжает ждать, а ждать нечего

Добавлено через 9 минут
Code
1
Merge2Channels запускается 2 раза
В смысле?... как ты это установил?
main запускает эту функцию дважды подряд, создаются две горутины, которые одновременно начинают посылать значения в out? И обе отрабатывают по 30 итераций? или в сумме? или они последовательно запускаются?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2020, 19:49

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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