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

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

15.05.2020, 09:54. Показов 28307. Ответов 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
Регистрация: 16.04.2017
Сообщений: 2
27.05.2020, 20:33
Студворк — интернет-сервис помощи студентам
Каким образом тривиальное решение типа такого:
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)
        }
    }()
}
может выдавать WA, а не IL?

В условии ничего не сказано о том в каком порядке должны считываться числа с каналов.
Я вижу 3 варианта:
содержимое входных каналов для примера:
in1: <-1<-2<-3<-4
in2: <-5<-6<-7<-8
1) Считывание без контроля парности:
Т.е результатом в out может быть любое паросочетание из in1 и in2: f(1)+f(6) или f(4) + f(7) итд
как следствие, в out, результат каждый раз будет случайным и проверить сами значения в тесте невозможно, можно проверить только их количество и время работы.
2) считывание c контролем парности, но без контроля порядка:
в out будут записаны: f(2)+f(6) , f(1) + f(5), f(3) + f(7), f(4) + f(8) или те же пары, в любом другом порядке.
Значения в out можно протестировать отсортировав их.
3) считывание c контролем парности и контролем порядка
в out будут f(1) + f(5), f(2)+f(6), f(3) + f(7), f(4) + f(8)

Для первого и второго варианта выдает RE с той самой паникой
Третий: WA 0.6сек и 50Мб
0
0 / 0 / 0
Регистрация: 27.05.2020
Сообщений: 4
28.05.2020, 09:57
Если в out попадает что-то не то или не в свое время выскакивает RE и в stderr видно, что не так.

Я еще попробовал вычисление и вывод засунуть в горутину и заметил, что порядок вывода сбился, значит задержки всетаки есть.
0
0 / 0 / 0
Регистрация: 28.05.2020
Сообщений: 1
28.05.2020, 17:33
Пишет аккаунт Школы озона по Го, напоминаю, что списывать запрещено.
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 12
28.05.2020, 18:19
Цитата Сообщение от Ozon_go_officia Посмотреть сообщение
Пишет аккаунт Школы озона по Го, напоминаю, что списывать запрещено.
Списывать неработающие решения?

Пишет человек который по почте вам рассказал про то что задачу обсуждают на форумах, потому что у неё некорректное описание

Я это делал в надежде на более конструктивный подход, нежели... это
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
28.05.2020, 19:03
Цитата Сообщение от mplain Посмотреть сообщение
Я это делал в надежде на более конструктивный подход, нежели... это
Ага:
Воще Бессмертный извинился за упущение и определил:
-- Учитель тут я, а не ты. Внимай моим словам.
1
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 12
01.06.2020, 00:07
Ну что, яндекс.контест озона закончился, кто верно решил задачку - напишите хоть как правильно работающая функция то должна выглядеть

Цитата Сообщение от yakanur Посмотреть сообщение
Мой результат
F PHP 7.3.5 OK - 285ms 2.00Mb
Напишешь решение? Я на PHP до 9 теста дошёл и в нём Memory-Limit 79мб.. Походу надо было файл кусками считывать, но времени не хватило на переделку
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
01.06.2020, 00:42
Цитата Сообщение от nerf74 Посмотреть сообщение
Ну что, яндекс.контест озона закончился, кто верно решил задачку - напишите хоть как правильно работающая функция то должна выглядеть
Например, читать в хэш, попутно проверяя, не нашли ли уже пару (в том числе 2 одинаковых числа по половине цели).
(Если сначала заполнить весь хэш, не хватает времени (по крайней мере, при лимите 1 секунда).
Если сначала прочитать в массив, не хватает памяти.
Это всё на С++, на других языках было ещё хуже, но после "OK" на С++ на других уже не пробовал.)
0
0 / 0 / 0
Регистрация: 27.05.2020
Сообщений: 4
01.06.2020, 08:35
Цитата Сообщение от nerf74 Посмотреть сообщение
Напишешь решение?
Если подсмотреть данные (я делал это через stderr) то становится видно где может жраться память и проц.

PHP
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
$input = fopen('input.txt', 'r');
$target = (int)fgets($input);
$result = 0;
 
function next_number($handle) {
    $result = '';
    while (1) {
        $symb = fread($handle, 1);
        if (!is_numeric($symb)) {
            return $result;
        }
        $result .= $symb;
    }
}
 
$numbers = [];
while ($a = next_number($input)) {
    $b = $target - $a;
    if ($b < 0) {
        continue;
    }
    if (isset($numbers[$b])) {
        $result = 1;
        break;
    }
    $numbers[$a] = 1;
}
 
file_put_contents('output.txt', $result);
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 6
01.06.2020, 16:58
А что насчёт задачи E ? Кто-нибудь добился результата ОК?
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
01.06.2020, 17:40
Цитата Сообщение от pve Посмотреть сообщение
А что насчёт задачи E ? Кто-нибудь добился результата ОК?
Судя по тому, что писали в телеграме (сегодня решил посмотреть, что пишут в интернетах, -- и вовремя, потому что сейчас там не то закрыто, не то ещё что), многие (если не все) из тех 32, кто добился результата "ОК", просто открыли какой-то файл и вписали туда "true".

(1) WTF?! Участники могут править свои результаты?

(2) Один из моих запусков завершился ошибкой
Code
1
main_test.go:1:1: expected 'package', found 'IDENT' trueage
(видимо, "хакеры" вписали "true" и в мой файл)

WTF^2?! Участники могут править и чужие результаты и файлы?

(Не знаю, к кому это вопросы: к Озону или Яндексу ¯\_(ツ)_/¯)
0
0 / 0 / 0
Регистрация: 27.05.2020
Сообщений: 4
01.06.2020, 19:05
Я тоже Е не осилил.

Когда что-то не то пишеш в выходной канал, выскакивает RE и видно что не так, когда делаешь меньше или больше записей, чем положено, тоже выдает понятную ошибку. Но когда, казалось бы, все верно - пишет WA без описания, входные числа простые, промежуточные данные выводил, все в сходится.

Выложите потом сюда решение этой задачи. Ведь авторы теста наверняка чем-то проверяли свои тесты, что-то рабочее должно быть...
0
0 / 0 / 0
Регистрация: 25.05.2020
Сообщений: 6
01.06.2020, 20:30
Цитата Сообщение от yakanur Посмотреть сообщение
Я тоже Е не осилил.

Когда что-то не то пишеш в выходной канал, выскакивает RE и видно что не так, когда делаешь меньше или больше записей, чем положено, тоже выдает понятную ошибку. Но когда, казалось бы, все верно - пишет WA без описания, входные числа простые, промежуточные данные выводил, все в сходится.

Выложите потом сюда решение этой задачи. Ведь авторы теста наверняка чем-то проверяли свои тесты, что-то рабочее должно быть...
Думаю там сам тест всё-таки неправильно работает.
Ибо также, судя по промежуточным выводам, логика понятна.

кто-нибудь использовал runtime.Gosched() ?
У меня от этого результат никак не поменялся в плане оценки времени и памяти.

Возможно в тесте кривой подсчёт времени, т.к. с задержкой выдаёт всё те же 0.6 сек, если только совсем уж большую поставить - секунд 10, то появляется ошибка IL. По крайней мере у меня так получалось.
0
0 / 0 / 0
Регистрация: 02.06.2020
Сообщений: 2
03.06.2020, 00:07
простейшая функция покрытая мьютексом дает IL
Go
1
2
3
4
5
6
7
8
9
10
var mu sync.Mutex
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <-chan int, out chan<- int, n int) {
    go func() {
        mu.Lock()
        for i := 0; i < n; i++ {
            out <- f(<-in1) + f(<-in2)
        }
        mu.Unlock()
    }()
}
также есть репо для проверки https://github.com/Gasoid/last... ntest-2020.
Получается что сумма должна выводиться в out в том же порядке в котором поступают данные в in.и И нельзя запускать одновременно две Merge2Channels , потому-что они вызывают мешанину в out.
Написал:

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
var sc chan struct{} = make(chan struct{}, 1)
 
func Merge2Channels(f func(int) int, in1 <-chan int, in2 <-chan int, out chan<- int, n int) {
 
    var wg sync.WaitGroup
    num := make([]int, n)
    go func() {
        sc <- struct{}{}
        var h int
            for i := 0; i < n; i++ {
            wg.Add(1)
            h = i
            x1, opened := <-in1 
            if !opened {
                break
            }
            x2, opened := <-in2
            if !opened {
                break
            }
            go func(x int) {
                k := f(x1) + f(x2)
                num[x] = k
                wg.Done()
            }(i)
        }
        wg.Wait()
        for i := 0; i <= h; i++ {
            out <- num[i]
        }
        <-sc
    }()
}
проходит все тесты по репо , но один фиг выпадает при проверке в WA

Добавлено через 1 час 31 минуту
wg.Add(1) перед
Go
1
2
3
4
5
6
 go func(x int) {
                k := f(x1) + f(x2)
                num[x] = k
                wg.Done()
            }(i)
надо
но все равно WA
0
1 / 1 / 0
Регистрация: 25.05.2020
Сообщений: 12
03.06.2020, 11:34
Цитата Сообщение от zopuh Посмотреть сообщение
проходит все тесты по репо , но один фиг выпадает при проверке в WA
Если я правильно понимаю, то можно сделать тест (полноту существующих тестов (и "несломанность" системы тестирования) пока не рассматриваем), который не пройдётся:
например, первый сигнал в первом канале и последний сигнал во втором канале читаются по полторы секунды,
а остальные -- очень быстро.
Тогда результат превысит три секунды.
0
0 / 0 / 0
Регистрация: 02.06.2020
Сообщений: 2
03.06.2020, 11:56
скорее около двух секунд, так как остальные горутины ,при условии что f func(int) int не работает слишком долго, отработают быстро. И чтение первого и последнего сигнала не будет разнесено во времени

Добавлено через 5 минут
Хотя да , будет больше 3 секунд)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2020, 11:56

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

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


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

Или воспользуйтесь поиском по форуму:
95
Ответ Создать тему
Новые блоги и статьи
Установка 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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru