Задать вопрос
  • Что и как лучше писать сначала: статью или научную работу?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Александр, не могу не отметить — ваш комментарий звучит довольно пренебрежительно. Постараюсь ответить по делу:

    Про уникальность. Seastar — сильное решение, но оно ограничено C++ и строго следует Shared-Nothing архитектуре. У меня другая модель и другие цели. Не утверждаю, что моя разработка полностью уникальна, но некоторые, действительно, уникальные находки, на мой взгляд, заслуживают внимания.

    Про конференции. Я выступал — да, на школьных и университетских. В первом случае понятно, почему приходилось упрощать, во втором — мой научный руководитель тоже просил максимально снижать порог вхождения. Как показала практика: не зря — из 30 человек доклад не понял никто. Поэтому опыт есть, но писать умею только сильно простую литературу. Боюсь прогадать со сложность.

    Про статьи. Частично согласен, но не считаю аргумент "проще" весомым. Тем более, что работы отличаются слишком сильно, чтобы можно было однозначно оценить их сложность. Paper оформляется в знакомом мне стиле и не требует упрощений. Со статьёй я могу оказаться "в пролете", если не угадаю сложность.

    Про стиль. На Хабре действительно много уникальных подходов к подаче материала, так что совет "прочитать N статей и писать похоже" скорее вредный.

    Про "где искать". С этим сложнее. В университете, дома или на улице я не встречал людей, кто интересуется low-latency и асинхронностью на глубоком уровне. Поэтому и обратился сюда — надеялся на более конкретные ориентиры, может, примеры форумов, дискорд-серверов, телеграм-чатов и т.п.

    Про публикации. Также рассматривал Medium и dev.to — они открытые, и там легче дотянуться до англоязычной аудитории.
    Написано
  • Что и как лучше писать сначала: статью или научную работу?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Akina, позвольте пояснить мою мотивацию.
    На первых тестах своего асинхронного фреймворка я увидел разницу почти в 40% по скорости и втрое по памяти по сравнению со следующим конкурентом. Это вдохновило меня дорабатывать проект, ещё сильнее увеличивая отрыв. В итоге на разработку ушло 9 месяцев.
    Если бы я обладал теми знаниями, которые собираюсь изложить в цикле статей, я бы достиг тех же результатов, вероятно, в пять раз быстрее.

    Я понимаю, что не смогу портировать свой фреймворк на все языки и переманить пользователей без поддержки крупных компаний. Но описанные мною приёмы позволят разработчикам других фреймворков улучшить их решения. Даже пара статей может за пару лет ускорить приложения по всему миру.

    Именно поэтому мне так важно не просто написать популярный пост, а попытаться оформить полноценную научную работу.
    Если исходить из Вашей точки зрения (что шансы попасть на серьёзную платформу у меня малы), что бы Вы посоветовали для того, чтобы знания всё равно дошли до заинтересованных разработчиков?
    Написано
  • Что и как лучше писать сначала: статью или научную работу?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Akina, то есть существуют платформы, на которых я не смогу опубликовать научную работу, если напишу статью? Я имею в виду, что статья будет сильно отличаться от научной работы, хотя и иметь одну и ту же тему.
    Написано
  • Какой atomic::Ordering нужен в этих ситуациях?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    jcmvbkbc, мы довольно забавно обменялись очевидными фактами : ) Вопрос про порядки всё ещё остаётся открытым. Выглядит будто в первом случае нужно использовать AqrRel, Acquire + Acquire во втором и AcqRel в последнем. Второй случай я больше отдал для проверки, чем для советов, так как в нём я уверен. А вот в первом и последнем я боюсь, что взял слишком строгий порядок.
    Написано
  • Какой atomic::Ordering нужен в этих ситуациях?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    jcmvbkbc, использовать всегда самый строгий вариант является довольно спорным решением. Хотелось бы использовать настолько слабый вариант, насколько это возможно.

    Я тоже читал, что Rust использует такую же модель, как в C, но в Rust можно использовать не только SeqCst в CAS операциях. По крайней мере в compare_exchange, который используется как альтернатива устаревшему compare_and_swap. Но он принимает 2 порядка, так что может иметь и другие различия. Например, для захвата блокировки обычно используют Acquire + Relaxed.
    Написано
  • Как настроить CMake на установку пакетов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Станислав Макаров, мне нужно написать два приложения: клиент с GUI, который по gRPC общается с сервером, и сам сервер. Я не знаю, на какой ОС будет собираться моё приложение. Мне сказали, что на него посмотрят, потом я пройдусь по всем компьютерам в компании и поставлю его. Оба проекта имеют общие зависимости, как минимум gRPC и сгенерированные proto файлы.

    Вопросов у меня достаточно много, например, как создать общие зависимости для двух проектов, как эти проекты собирать под любую ОС? Но для начала, хочу собрать хотя бы сервер.

    Я задал этот вопрос, чтобы прояснить ситуацию, так как разные ссылки в Гугле дают разные ответы, но на форуме ответы тоже разделились. Выше мне посоветовали скачать библиотеки без менеджера, Вы советуете его использовать.
    Написано
  • Как настроить CMake на установку пакетов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    res2001, куда следует устанавливать статически линкуемые библиотеки (в какую папку проекта)? У Nginx я не нашёл папки с зависимостями (хотя мог плохо искать), у Tarantool есть папка third-party, у Aerospike что-то странное (есть папка modules, но по мимо неё существует pkg с пустыми папками).

    Как их линковать мне тоже ещё не известно, но я думаю, что смогу это нагуглить, но, если Вам несложно, не могли бы вы задать вектор направления поиска?
    Написано
  • По каким причинам тест может "падать" именно в github actions?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    historydev, вынесите в ответ комментарий, если хотите, чтобы я отметил его решением.
    Написано
  • Как назвать трейты для каналов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, LocalChannel не реализует Send и не использует примитивы синхронизации, поэтому он более эффективен при shared-nothing.

    Они находятся в разных модулях, но, если у их этих трейтов будут одинаковые названия, IDE будут не знать, откуда импортировать.
    Написано
  • Как назвать трейты для каналов?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Более удобная миграция с LocalChannel на обычный Channel и наоборот. А также возможность написать свои собственные каналы под этот трейт, на который могут завязаться в том числе и другие программы.
    Написано
  • Как узнать, что программа запущена в дебагере из кода?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, у меня есть обнаружение дедлоков. Функция теста паникует, если тест не завершился за секунду. Когда используется дебагер, оставляются точки прерывания, которыми разработчик пользуется для отладки. В этот момент время идёт, и функция будет паниковать, когда разработчик пойдёт к следующей точке. Хотелось бы обнаружить, что используется дебагер, чтобы убрать панику по времени.
    Написано
  • Почему асинхронный блок поверх асинхронного асинхронного блока удваивает память?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Я написал вспомогательную структуру для целей выше.
    struct WithRes<R, Fut: Future<Output=R>> {
        res_ptr: *mut R,
        fut: Fut
    }
    
    impl<R, Fut: Future<Output=R>> WithRes<R, Fut> {
        fn new(res_ptr: *mut R, fut: Fut) -> Self {
            Self { res_ptr, fut }
        }
    }
    
    impl<R, Fut: Future<Output=R>> Future for WithRes<R, Fut> {
        type Output = ();
    
        fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
            let this = unsafe { self.get_unchecked_mut() };
            let mut pinned = unsafe { Pin::new_unchecked(&mut this.fut) };
            match pinned.as_mut().poll(cx) {
                Poll::Pending => Poll::Pending,
                Poll::Ready(res) => {
                    unsafe { this.res_ptr.write(res) };
                    Poll::Ready(())
                }
            }
        }
    }


    Она не удваивает память и держит future всё так же на стеке. Однако я не уверен, во что она компилируется. В том плане, zero-cost эта абстракция или нет (тут я создаю pinned, который исполняет future по ссылке, но WithRes::poll тоже вызывается по ссылке).

    Это решение можно приспособить к другим проблемам, но вопрос всё ещё остаётся. Я проверил, асинхронные замыкания тоже не удваивают память. Василий Банников, стоит ли мне спросить на иностранном форуме и поднять issue?
    Написано
  • Почему асинхронный блок поверх асинхронного асинхронного блока удваивает память?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, я помню, что они делают именно так (вставляют блок в блок), но я перечитал часть исходников и не нашёл там этого. Так что я или плохо искал, или они с этим не борются.
    Написано
  • Почему асинхронный блок поверх асинхронного асинхронного блока удваивает память?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Василий Банников, а потребитель поймёт, что память удваивается? Я это обнаружил, потому что в режиме debug собираю статистику размеров future. Потребитель увидит только большие затраты памяти.
    Написано
  • Почему в Go вакансиях требование знания PHP?

    Eugene-Usachev
    @Eugene-Usachev
    Сергей Горностаев, где они ищут разработчиков на Rust, и как туда попасть?
    Написано
  • Как в библиотеке пометить макрос, как unstable?

    Eugene-Usachev
    @Eugene-Usachev Автор вопроса
    Мне нравиться эта мысль, спасибо.
    Написано
  • Есть ли разница кто будет обрабатывать оплату на сайте - фронт или бек?

    Eugene-Usachev
    @Eugene-Usachev
    Сергей Соловьев, я не уверен, что Вы правильно поняли вопрос. Автор причислил к "клиенту" nextjs, который в большинстве случаев является отдельным сервером (не только отдаёт статику, но и может отправлять запросы другим серверам, скрыто от пользователя). Если автор использует nextjs в бессерверном режиме, Ваш ответ верный. Но автор не уточнил этого.
    Написано
  • Как обрабатывать корутину с бесконечным циклом?

    Eugene-Usachev
    @Eugene-Usachev
    historydev, если уж правильно, то так
    Корутина (сопрограмма) — это блок кода, который работает асинхронно, то есть по очереди.

    То что называется горутины, по сути является и корутинами. Корутины есть почти в любом современном языке программирования (если не в любом). Это и те же async / await Rust, Promises в JS и так далее.
    Написано