|
2 / 2 / 1
Регистрация: 02.11.2017
Сообщений: 60
|
||||||
Неблокирующая функция15.05.2020, 09:54. Показов 28324. Ответов 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 ()
0
|
||||||
| 15.05.2020, 09:54 | |
|
Ответы с готовыми решениями:
94
Неблокирующая запись в файл Неблокирующая запись файла
|
|
|
||
| 26.05.2020, 15:00 | ||
|
0
|
||
|
Особый статус
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
|
|
| 26.05.2020, 15:25 | |
|
0
|
|
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
|
| 26.05.2020, 15:43 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
|
|
| 26.05.2020, 17:32 | |
|
Garry Galler, Ок, в таком случае, если задача школьная - ждём твоё решение, иначе - сам знаешь кто
Так же ждём определение что такое "реальная программа" и её отличия от других
0
|
|
|
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
|
|||
| 26.05.2020, 17:36 | |||
|
Попробовал добавить свой промежуточный буферизованный канал размера n, из которого ещё одна го-рутина читает и пишет уже в главный out -- всё равно TL. (Доступ к мэпам -- с мьютекесами, мьютексы передаются по ссылке ^_^. На какие грабли я ещё не наступил?)
0
|
|||
|
0 / 0 / 0
Регистрация: 23.05.2020
Сообщений: 8
|
|
| 26.05.2020, 17:40 | |
|
Neko-neko, По поводу граблей не скажу, просто своими наблюдениями делюсь
Ни чем не лучше, просто как альтернатива
0
|
|
|
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
|
|
| 26.05.2020, 18:17 | |
|
Garry Galler, так вот я вроде блокировал получение ссуммы, пока обе переменные не возьмут свои значения, с помощью WaitGroup
0
|
|
|
|
||||||||||
| 26.05.2020, 19:06 | ||||||||||
Не по теме: Жди. Добавлено через 2 минуты Добавлено через 5 минут Впрочем, сам код примера Merge2Channels очень странный. И непонятно, что вы там вообще ожидаете получить. Там на каждой итерации переменным присваивается 0. В чем смысл?
0
|
||||||||||
|
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
|
||||||
| 26.05.2020, 19:08 | ||||||
|
Garry Galler, прописал вот такое решение, видимо я, что то не так понял, но данное решение тоже выдает WA
0
|
||||||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||
| 26.05.2020, 19:54 | ||
|
Смотри: сначала идёт инициализация x1, x2 и wg, только после этого запускаются две горутины для записи, на момент их запуска x1 и x2 уже проинициализированы, так что тут всё норм. Далее запустившая их горутина блочится на wg пока те две записывающие горутины не завершатся, а значит и завершат запись x1 и x2.
0
|
||
|
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
|
||||||
| 26.05.2020, 20:00 | ||||||
|
korvin_
а зачем здесь вообще две дополнительные грутины и WaitGroup? разве без этого программа не будет работать точно так же - блокировать тред, пока не получит сначала <-in1, потом <-in2 ?
0
|
||||||
|
117 / 118 / 52
Регистрация: 19.12.2014
Сообщений: 612
|
|
| 26.05.2020, 20:08 | |
|
mplain, функция f работать может долго, поэтому нужно точно знать, что мы получили значения. Ну это я так понял
Добавлено через 4 минуты korvin_, и все равно, все мои решения выдают WA, уже рельно даже не знаю в какую сторону капнуть, на локалке как уже только не тестил
0
|
|
|
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
|
|
| 26.05.2020, 20:14 | |
|
lokilo
А на что это влияет? поток будет блокировать, пока не получит число из <-in1 затем будет блокировать, пока не расчитает функцию от этого числа потом будет блокировать, пока не получит число из <-in2 потом опять блокирует пока считает функцию и наконец блокирует пока канал out не примет получившееся значение после чего цикл идёт по новой.
0
|
|
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||||||||
| 26.05.2020, 20:23 | ||||||||
f(<-in1) и f(<-in2) выполняются «параллельно», а не последовательно, в отличие от простого f(<-in1) + f(<-in2)Впрочем, большого прироста это не даст всё равно. Я сделал небольшой бенчмарк: Slow — простая функция с f(<-in1) + f(<-in2), Fast* — несколько моих вариантов, lokilo соответсвенно, его функция с WaitGroup.delay — сколько времени выполняется f число во второй колонке — сколько раз успела отработать функция за отведённое время (чем больше, тем лучше)
0
|
||||||||
|
|
||||||
| 26.05.2020, 22:45 | ||||||
|
Ок. Я понял, что не понимаю задание.
Атомики тут не нужны, ибо конкуренции никакой нет - одна же горутина всего. Откуда будет ввод данных в каналы? Что должна считать функция складывающая значения? Кумулятивную сумму всех операций или каждый раз индивидуально для двух значений из двух каналов?
0
|
||||||
|
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
|
||||
| 26.05.2020, 22:59 | ||||
|
Наример с канала in1 приходят числа [1,2,3], с канала in2 — [4,5,6], а функция f = func(x int) int { return x * x }, тогда в канал out нужно записать числа [1*1 + 4*4, 2*2 + 5*5, 3*3 + 6*6], т.е. [17, 29, 45]. То что ты написал уже было в самом начале.
0
|
||||
|
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
|
|||
| 26.05.2020, 23:04 | |||
|
0
|
|||
|
|
||||
| 26.05.2020, 23:20 | ||||
|
Добавлено через 11 минут P.S. Вообщем, c учениками разных школ программирования всегда одна и та же проблема: они не дают нормальных описаний задач, не знают как будет происходить (или как его делать) ввод и свои проблемы описывают одинаково: RuntimeError (или любая другая ни о чем не говорящая ошибка). А ведь могли бы и кураторов уточнить... Я же предпочитаю решать реальные, а не надуманные задачи. Вот нужно было мне для коммерческого приложения сделать корректное завершение работающих горутин по Ctrl+C - сделал. Задача реальная? Реальная. А тут...
0
|
||||
|
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
|
|
| 27.05.2020, 00:15 | |
|
Garry Galler
Слушай ну я уже не могу сдержаться ![]() Я понимаю, ты на этом форуме завсегдатай... with all due respect но ё-маё, ты пришел в этот тред и лечишь тут народ что у них задача неправильная ну не нравится тебе, ну неинтересны тебе школьный задачи - ну пройди ты мимо ну ёпт, ну чего ты ворчишь как старый дед ну no offence ![]() Добавлено через 6 минут Сейчас уже по сути вопрос не то том, как решить поставленную задачу, а скорее в том, как нам, участникам контеста, понять, чего в условии НЕ сказано, понять как её-таки победить Я написал в поддержку ещё вчера, но они молчат Мы знаем следующее: - если сделать функцию блокирующей - будет паника: функция должна быть неблокирующей - если передать слишком мало чисел (цикл i<n-1) - будет паника: все горутины спят, дедлок - если передать слишком много чисел (цикл i<n+1) - будет паника: в канале 69 элементов, а должно быть 70 (??) - если передать неправильное (произвольное) число - будет паника: вы передали 12345, а надо было 67890 - если функция спит секунду - получаем idleness-limit-exceeded (IL) - если делаем всё вроде бы правильно - получаем wrong answer (WA) - если передать f(<-in1) + f(<-in2) или наоборот f(<-in2) + f(<-in1) - разницы нет, паники не получаем, из чего можно сделать вывод что функция f не имеет state - методом перебора я установил что в первом тесте n = 30 (кажется) кто-нибудь прошёл хотя бы первый тест?
0
|
|
|
0 / 0 / 0
Регистрация: 19.05.2020
Сообщений: 11
|
||
| 27.05.2020, 00:15 | ||
|
Вообще появилась одна идея и заключается она в том, что бы например, завести структуру и инициализировать её двумя значениями. Ну и как-то отталкиваться от этой структурки. Например, завести третье поле и хранить там результат, а затем класть в out. Таким, образом, не будет условной гонки по считыванию и всё будет одновременно скажем так выполнятся
0
|
||
| 27.05.2020, 00:15 | |
|
Функция поиска в массиве и указатели + функция сортировки и поиск найденного элемента
Функция sqrt: существует более одного экземпляра. Функция перегруженная Перегрузка операций: friend-функция или функция-член класса Какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера 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С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|