2 / 2 / 1
Регистрация: 02.11.2017
Сообщений: 60

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

15.05.2020, 09:54. Показов 28454. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru