Tishka17
Например чтение из сокета?
чтение из сокета неблокирующее
🍁 Jaŭhien
а смысл делать блокирующие действия в asyncio
koder
чтение из сокета неблокирующее
Я не понимаю что ты имеешь в виду. Для работы с сокетами asyncio равноценен по возможностям сюпотока
koder
@kzh3ka говорит что потоки и сопроцедуры в питоне имеют строго разлиные области применентя
Tishka17
Я не понимаю что ты имеешь в виду. Для работы с сокетами asyncio равноценен по возможностям сюпотока
я говорю, что asyncio юзает внизу неблокирующие операции с сокетами. не?
koder
Поэтому нет смысла их сравнивать, я говорю что это чушь. Хотя области применения не полностью совпадают
koder
я говорю, что asyncio юзает внизу неблокирующие операции с сокетами. не?
Это да, хотя смотря что брать за операцию. Где-то внизу есть блокирующий poll. Но это не тт различие, которое мы обсуждаем
koder
Или я чего-то пропустил
Евгений
@kzh3ka говорит что потоки и сопроцедуры в питоне имеют строго разлиные области применентя
ну назови области применения в которых потоки и асинхронность будет оденаково хороши.
koder
Обработка сетевых соединений
🍁 Jaŭhien
IO?
Евгений
Обработка сетевых соединений
Нет, для них лучше использовать asycio
koder
Контроль/взаимодействие с запущенными стронними процесса и
koder
Нет, для них лучше использовать asycio
См выше - как раз нифига. Потоки куда быстрее
Alex
зависит от времени жизни сетевого соединения \ количества одновременно открытых подключений.
Евгений
См выше - как раз нифига. Потоки куда быстрее
Напиши вот такое пожалуйста на потоках https://github.com/squeaky-pl/japronto
koder
Асинкио дает интересный апи, но нифига в среднем не лучше потоков в питоне, не считая 30к+ соединений
Tishka17
Это да, хотя смотря что брать за операцию. Где-то внизу есть блокирующий poll. Но это не тт различие, которое мы обсуждаем
да нет, как раз речь о том что файловый IO блокирующий, CPU-bound операции - тоже. Какой-нибудь иной системный вызов тоже может. Вот их на асинкио и не сделашеь
koder
Напиши вот такое пожалуйста на потоках https://github.com/squeaky-pl/japronto
Еще раз - смотри вверху тесты. На потоках будет куда быстрее
🍁 Jaŭhien
См выше - как раз нифига. Потоки куда быстрее
Потоки быстрее пока их немного
Евгений
Alex
Ну так напиши если на потоках быстрее
аргумент "сперва добейся"?
Alex
ты мне кстати про C extension так и не ответил
Alex
Кто?
Евгений
Евгений
Ну ваши утверждения голословны. https://github.com/squeaky-pl/japronto - вот реализация сервера на asycnio через uvloop.
🍁 Jaŭhien
и код на asyncio проще, чем многопоточный
koder
Ну ваши утверждения голословны. https://github.com/squeaky-pl/japronto - вот реализация сервера на asycnio через uvloop.
100й раз говорю - вверху ссылка скорости работы в т.ч. uvloop. Потоки в 10-4 раз быстрее
koder
А то что там кто-то написал, ну молодец. Только что это доказывает?
koder
Блин, напиши разрабам, они, походу, не в курсе
Да все в курсе. Но asyncio не про скорость, а про асинхронное апи
Alex
Покажешь свои бенчи?
выше же показывал
🍁 Jaŭhien
А я не видел
Alex
опять ты
koder
https://github.com/koder-ua/network_ping_test/blob/master/perf_report.md
koder
Собственно мне автор uvloop их ревьювил и слал на них патчи
Alex
@Tishka17 пропиши ему уже RO, вероятно он не излечим.
Проксимов
Нафига?
Проксимов
koder
https://github.com/koder-ua/network_ping_test/blob/master/perf_report.md эта?
да вот патч от селиванова для протоклов - https://github.com/koder-ua/network_ping_test/commit/0abb5198226513541e48491db33b32a752225f82
koder
Блин, напиши разрабам, они, походу, не в курсе
собственно скорость далеко не самая основная проблема всего этого. uvloop ее в меру лечит. Там куча проблем, поэтому и trio есть и curio, и из них тащат логику. Часть в 3.7 полечили, но еще осталось.
Promise<>
generator1[0] =&gt; generator2[0] =&gt; generator3[0] =&gt; generator1[1] =&gt; generator2[1] =&gt; generator3[1] как будет выглядеть такой скрипт?
Promise<>
сначала нулевой элемент генератора1, потом нулевой элемент генератора2 итд
Alex
если прямо хочешь всю последовательность лениво - напиши генератор с двумя вложенными циклами и yield
Alex
zip же ленивый. В третьем. Во втором есть что-то в itertools
да но он возвращает сразу кортеж из N элементов
Promise<>
да, вот итертулс идеально подойдет
koder
да но он возвращает сразу кортеж из N элементов
а как по-другому? возвращать итератор из 3х элементов?
koder
а, я понял
koder
ок
Alex
в 2.x был itertools.izip
Евгений
да вот патч от селиванова для протоклов - https://github.com/koder-ua/network_ping_test/commit/0abb5198226513541e48491db33b32a752225f82
У меня есть пара вопросом по тестам. Есть замер нагрузки CPU по uvloop и asyncio. А по потокам есть замеры нагрузки CPU?
Promise<>
a, b = (x for x in range(5)), (y for y in range(5)) for i in a: yield i for j in b: yield b что то типо такого?
Aragaer
нет, там есть другое
koder
У меня есть пара вопросом по тестам. Есть замер нагрузки CPU по uvloop и asyncio. А по потокам есть замеры нагрузки CPU?
вроде там одинаково для всех тестов. в смысле все данные должны быть собраны для всех тестов одинаково
koder
сча
Aragaer
&gt;&gt;&gt; list(itertools.chain.from_iterable(zip(&#39;abc&#39;, &#39;def&#39;, &#39;xyz&#39;))) [&#39;a&#39;, &#39;d&#39;, &#39;x&#39;, &#39;b&#39;, &#39;e&#39;, &#39;y&#39;, &#39;c&#39;, &#39;f&#39;, &#39;z&#39;]
koder
У меня есть пара вопросом по тестам. Есть замер нагрузки CPU по uvloop и asyncio. А по потокам есть замеры нагрузки CPU?
https://github.com/koder-ua/network_ping_test/blob/master/perf_report.md#%D0%B4%D0%BE%D0%BB%D1%8F-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B2-user-mode-%D0%B2%D0%BE-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F-%D1%82%D0%B5%D1%81%D1%82%D0%B0-%D0%BE%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D0%B5%D0%BD%D0%BE-%D0%B4%D0%BE-5-10 и там прямо в yaml с результатами сырые данные https://github.com/koder-ua/network_ping_test/blob/master/results/unified_test_results2.yaml
Aragaer
простой чейн может сплющить список кортежей в просто список, а фром итерабл может достать их из зипа
koder
@kzh3ka а чуть выше итоги трассирования perf совершаемых системных выховов
Alex
да, вот итертулс идеально подойдет
держи def myzip(*args): iters = [iter(arg) for arg in args] num_active = len(iters) while True: for i, it in enumerate(iters): if it is None: continue try: yield next(it) except StopIteration: num_active -= 1 if not num_active: return iters[i] = None print(list(myzip(&#39;abc&#39;, &#39;defg&#39;, &#39;hij&#39;)))
Alex
это если нужен честный обход генераторов по очереди. если нет - вон выше пример от @aragaer однострочник
Alex
только учти что zip обходит последовательности пока хотя бы одна из них не закончится (т.е. работает по самой короткой последовательности)
Promise<>
А возможно ли сделать по самой длинной?
Alex
itertoos.zip_longest обходит по самой длинной последовательности
Alex
подставляя значения fillvalue аргумента вместо тех что уже знакончились
Promise<>
Примерно такая вот проблема, поэтому хочу использовать лениво
Promise<>
Promise<>
test_obj - словарь со значениями, который мы получаем из циклов как все циклы завершились =&gt; objects[&#39;tests&#39;].append(test_obj), добавляем в массив test_obj (куда стрелочка зеленая показывает)
Alex
&gt;&gt;&gt; list(itertools.chain.from_iterable(itertools.zip_longest(&#39;abc&#39;, &#39;defg&#39;, &#39;xyz&#39;, fillvalue=&#39;-&#39;))) [&#39;a&#39;, &#39;d&#39;, &#39;x&#39;, &#39;b&#39;, &#39;e&#39;, &#39;y&#39;, &#39;c&#39;, &#39;f&#39;, &#39;z&#39;, &#39;-&#39;, &#39;g&#39;, &#39;-&#39;]
Anonymous
кто напишет чекер соксов ? (географию)