Green threads

95 views
Skip to first unread message

Darkemon

unread,
Nov 10, 2014, 5:13:39 AM11/10/14
to rust-r...@googlegroups.com
Добрый день всем! Может кто знает, реализовано ли переключение контекста между грин трэдами при работе с сокетами?

Владимир Матвеев

unread,
Nov 10, 2014, 6:12:30 AM11/10/14
to rust-r...@googlegroups.com
Добрый день!

libgreen в Rust основан на libuv, поэтому да, переключение контекста при работе с сокетами там есть.

Однако libgreen больше не будет входить в стандартную поставку Rust, потому что расходы на поддержание одинакового API для различных рантаймов оказались слишком высоки. Такой подход накладывает серьёзные ограничения на производительность и выразительность API, усложняет создание кроссплатформенного кода и не даёт особых преимуществ. В частности, из-за отсутствия (и принципиальной невозможности добавить, потому что Rust - системный язык, близкий к железу) точек переключения контекста кроме вызовов функций в рантайме, а также из-за недостатков в реализации самого libuv (ну и из-за отсутствия особого желания в развитии самого libgreen) производительность libgreen сейчас очень низкая, гораздо ниже Go и других гринтредовых рантаймов.

Общий план - перевести стандартную библиотеку исключительно на работу с нативным блокирующим вводом-выводом и нативными же тредами, а асинхронный ввод-вывод и другие модели многопоточности предоставлять сторонними библиотеками. Например, есть активно развивающаяся библиотека mio, которая предоставляет асинхронные сокеты через нативный event loop.

Darkemon

unread,
Nov 10, 2014, 7:34:36 AM11/10/14
to rust-r...@googlegroups.com
Спасибо!
На данный момент, я смотрю, из std выпилили libuv, но при этом оставили libgreen и он похоже не основан на libuv, у него есть свой event loop green::basic::event_loop.
Получается грин трэды совсем из std уберут?

Так-то бы хотелось видеть нечто похожее на gevent для Python, только ещё с поддержкой нативной многопоточности (как сейчас умеют грин трэды в rust'е)

Владимир Матвеев

unread,
Nov 10, 2014, 7:49:55 AM11/10/14
to rust-r...@googlegroups.com
Да, librustuv выпилен, поэтому, похоже, моё утверждение о вводе-выводе с libgreen неправильно. Вот пулл-реквест, где это было сделано. Таким образом, в самом деле, сейчас ввод-вывод с libgreen будет забирать шедулер себе целиком. Асинхронный ввод-вывод через libuv был вынесен в отдельную библиотеку.

И да, грин-треды из std уберут совсем. Предполагается, что будут соответствующие сторонние библиотеки.

В любом случае, без полномасштабной поддержки со стороны компилятора (как в Go), которая невозможна для системного языка, легковесные потоки сильно ограничены.

Darkemon

unread,
Nov 10, 2014, 8:41:31 AM11/10/14
to rust-r...@googlegroups.com
Ясно, надеюсь rustuv не бросят, ибо библиотека весьма мощная, node.js тому доказательство :)

Сергей Прохоров

unread,
Nov 11, 2014, 6:12:54 AM11/11/14
to rust-r...@googlegroups.com
У меня, кстати, были проблемы с расспараллеливанием по ядрам зеленых потоков, работающих с сокетами.
Был игрушечный tcp сервер, который считывал из сокета данные, выполнял над ними тяжелую по CPU работу и записывал обратно. Так вот с зелеными потоками оказалось не так просто заставить этот сервер нагружать больше одного ядра https://gist.github.com/seriyps/fd6d29442e16c44ba400
Как объяснили в IRC, это связано с ограничениями libuv. Но было это месяца 3 назад, в rust 0.11

понедельник, 10 ноября 2014 г., 13:13:39 UTC+3 пользователь Darkemon написал:

Darkemon

unread,
Nov 13, 2014, 8:02:06 AM11/13/14
to rust-r...@googlegroups.com
Возможно, проблема из-за того, что libuv не умеет один event loop использовать в нескольких потоках. В rust'е в каждом нативном потоке (шедулер в их терминологии), в котором бегают грин трэды, свой event loop. Если у шедулера кончаются грин трэды, то он их крадёт у других шедулеров. Получается, если в одном грин трэде одного шедулера со своим event loop из libuv, например, идёт чтение из сокета, а другой шедулер забрал себе этот грин трэд, то операция чтения из сокета не выполнится, пока грин трэд не попадёт обратно в свой родной event loop. В rustuv запилили специальный модуль Homing, в котором реализован функционал возврата в родной event loop.

Может быть проще реализовать библиотеку, аналогичную libuv или libev, но чисто на rust с учётом его возможностей, и привязать её к грин трэдам.


понедельник, 10 ноября 2014 г., 13:13:39 UTC+3 пользователь Darkemon написал:
Добрый день всем! Может кто знает, реализовано ли переключение контекста между грин трэдами при работе с сокетами?
Reply all
Reply to author
Forward
0 new messages