LINUX.ORG.RU
ФорумTalks

Драма tokio vs async-std

 


0

3

Что-то странное происходит. В одном из устаревших проектов для асинхронного ИО в rust romio появился pull request, который добавил в ридми проекта упоминание tokio как более современной альтернативы поддерживающей новый синтаксис async/await (до этого там было лишь упоминание async-std). Спустя некоторое время, автор pull request’а, и все, кто поставил ему палец вверх оказались в бане. Спустя некоторое время реквест таки замержили, и автор репозитория написал пространный коммент, которые среди прочего упоминает о конфликте между разработчиками tokio и async-std.

Pull request https://github.com/withoutboats/romio/pull/106 Коммент - https://github.com/withoutboats/romio/pull/106#issuecomment-548947560

Кто-то в курсе, в чем вообще суть конфликта между tokio и async-std? Очень любопытно об этом узнать. визаутбоатс пишет, что конфликт непубличный, но в эпоху интернета хотя бы часть инфы должна была просочиться. А я тут в танке сидел за новостями не следил.

PS: «My code is written for people of better character than you, go away.» - фонд золотых цитат прямо)

★★★★★

Ответ на: комментарий от WitcherGeralt

Создал две горутины, которые пишут в файлы.

package main

import (
        "io/ioutil"
)

func check(e error) {
        if e != nil {
                panic(e)
        }
}

func main() {
        finished1 := make(chan bool)
        finished2 := make(chan bool)

        go func() {
                d1 := []byte("hello\ngo\n")
                err := ioutil.WriteFile("/tmp/dat1", d1, 0644)
                check(err)
                finished1 <- true
        }()

        go func() {
                d1 := []byte("hello\ngo\n")
                err := ioutil.WriteFile("/tmp/dat2", d1, 0644)
                check(err)
                finished2 <- true
        }()

        <-finished1
        <-finished2

}

Жду в main окончание обеих

strace -f

[pid 24474] openat(AT_FDCWD, "/tmp/dat2", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0644 <unfinished ...>
[pid 24476] <... nanosleep resumed> NULL) = 0
[pid 24475] nanosleep({tv_sec=0, tv_nsec=20000},  <unfinished ...>
[pid 24474] <... openat resumed> )      = 3
[pid 24476] futex(0xc000076148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 24474] epoll_create1(EPOLL_CLOEXEC <unfinished ...>
[pid 24478] <... futex resumed> )       = 0
[pid 24474] <... epoll_create1 resumed> ) = 4
[pid 24478] futex(0xc000076148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 24476] <... futex resumed> )       = 1
[pid 24474] epoll_ctl(4, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=157642408, u64=140144940510888}} <unfinished ...>
[pid 24475] <... nanosleep resumed> NULL) = 0
[pid 24474] <... epoll_ctl resumed> )   = -1 EPERM (Operation not permitted)
[pid 24475] nanosleep({tv_sec=0, tv_nsec=20000},  <unfinished ...>
[pid 24474] epoll_ctl(4, EPOLL_CTL_DEL, 3, 0xc00004ed9c) = -1 EPERM (Operation not permitted)
[pid 24476] openat(AT_FDCWD, "/tmp/dat1", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0644 <unfinished ...>
[pid 24474] write(3, "hello\ngo\n", 9 <unfinished ...>
[pid 24475] <... nanosleep resumed> NULL) = 0
[pid 24474] <... write resumed> )       = 9
[pid 24476] <... openat resumed> )      = 5
[pid 24474] close(3 <unfinished ...>
[pid 24475] nanosleep({tv_sec=0, tv_nsec=20000},  <unfinished ...>
[pid 24474] <... close resumed> )       = 0
[pid 24476] epoll_ctl(4, EPOLL_CTL_ADD, 5, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=157642408, u64=140144940510888}} <unfinished ...>
[pid 24474] futex(0x534a48, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 24476] <... epoll_ctl resumed> )   = -1 EPERM (Operation not permitted)
[pid 24475] <... nanosleep resumed> NULL) = 0
[pid 24476] epoll_ctl(4, EPOLL_CTL_DEL, 5, 0xc00009ad9c <unfinished ...>
[pid 24475] nanosleep({tv_sec=0, tv_nsec=20000},  <unfinished ...>
[pid 24476] <... epoll_ctl resumed> )   = -1 EPERM (Operation not permitted)
[pid 24476] write(5, "hello\ngo\n", 9 <unfinished ...>
[pid 24475] <... nanosleep resumed> NULL) = 0
[pid 24476] <... write resumed> )       = 9
[pid 24475] nanosleep({tv_sec=0, tv_nsec=20000},  <unfinished ...>
[pid 24476] close(5)                    = 0

Го пытается воткнуть файлы в epoll - фейлит с EPERM, нету поддержки.

В итоге используются блокирующие операции, на каком-то потоке. Я думаю что на специализированом для блокирующего IO, врядли бы они делали это в основном пуле горутин. Ведь кроме 24474 и 24476, постоянно еще просыпается какой-то 24475 и что-то делает непонятное, вот я думаю что он не в пуле блокирующего IO.

vertexua ★★★★★
()
Ответ на: комментарий от Deleted

Вай нот? Просто сделать std::async::*. Это же тебе не C, где стопицот компилеров и нужно пытаться хоть как-то консистентно следить за этим барахлом в виде стандартов.

kirk_johnson ★☆
()
Последнее исправление: kirk_johnson (всего исправлений: 1)
Ответ на: комментарий от kirk_johnson

Просто сделать std::async::*

И напихать туда libuv, ФС-тредпул и прочее говно. Потом весело пытаться портировать все это на AVR и ESP32

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Пажжи, причем тут тредпул. Реактор отдельно вынесите, и дело в шляпе.

kirk_johnson ★☆
()
Ответ на: комментарий от vertexua

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

WitcherGeralt ★★
()
Ответ на: комментарий от Deleted

вот-вот выпустит версию 1.0 чтоб дать всем какие-то гарантии по API

Ключевое слово «какие-то». Сама по себе 1.0 версия (как и любая другая) никаких гарантий не даёт.

DarkEld3r ★★★★★
()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

async-std дублирует функции из std, так что API во многом предрешено. Во-вторых, часть команды async-std переметнулась из tokio – там они набили руку и поняли как надо делать. В-третьих, tokio уже тыщу лет как версии 0, отчасти поэтому разрабы сторонних либ не торопятся обновляться – на crates.io полный разброд версий tokio в разных либах

Deleted
()
Ответ на: комментарий от Deleted

В-третьих, tokio уже тыщу лет как версии 0

Ты же понимаешь, что разница чисто психологическая? Если ты сделаешь 1.0, а потом надо будет всё поломать, то придётся сделать 2.0. И наоборот - версия 0.2 может быть вполне стабильной в плане апи.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

То-есть, остальные пункты ты сознательно проигнорировал. Это тоже что-то психологическое

Deleted
()
Ответ на: комментарий от Deleted

Я прокомментировал версионирование, с остальным спорить не интересно. Ты в ответ вывалил «пункты», но по существу ничего не сказал до сих пор.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

То-есть тебе интересно пообсуждать психологическое влияние циферок, не вдаваясь в подробности конкретного проекта. Есть форумы и для этого

http://www.woman.ru/horoscope/medley10/thread/4590375/

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

Ищи меня под ником «Вишенка»

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.