🍁 Jaŭhien
а смысл делать блокирующие действия в asyncio
koder
@kzh3ka говорит что потоки и сопроцедуры в питоне имеют строго разлиные области применентя
Tishka17
koder
Поэтому нет смысла их сравнивать, я говорю что это чушь. Хотя области применения не полностью совпадают
koder
Или я чего-то пропустил
Евгений
koder
Обработка сетевых соединений
🍁 Jaŭhien
IO?
koder
Контроль/взаимодействие с запущенными стронними процесса и
Alex
Alex
зависит от времени жизни сетевого соединения \ количества одновременно открытых подключений.
koder
Асинкио дает интересный апи, но нифига в среднем не лучше потоков в питоне, не считая 30к+ соединений
koder
🍁 Jaŭhien
Евгений
koder
Alex
ты мне кстати про C extension так и не ответил
koder
Alex
Евгений
Ну ваши утверждения голословны.
https://github.com/squeaky-pl/japronto - вот реализация сервера на asycnio через uvloop.
Проксимов
🍁 Jaŭhien
и код на asyncio проще, чем многопоточный
koder
koder
А то что там кто-то написал, ну молодец. Только что это доказывает?
🍁 Jaŭhien
Alex
🍁 Jaŭhien
А я не видел
Alex
опять ты
koder
https://github.com/koder-ua/network_ping_test/blob/master/perf_report.md
koder
Собственно мне автор uvloop их ревьювил и слал на них патчи
Alex
@Tishka17 пропиши ему уже RO, вероятно он не излечим.
Проксимов
Нафига?
Евгений
Проксимов
koder
Блин, напиши разрабам, они, походу, не в курсе
собственно скорость далеко не самая основная проблема всего этого. uvloop ее в меру лечит.
Там куча проблем, поэтому и trio есть и curio, и из них тащат логику. Часть в 3.7 полечили,
но еще осталось.
Promise<>
generator1[0] => generator2[0] => generator3[0] => generator1[1] => generator2[1] => generator3[1]
как будет выглядеть такой скрипт?
Promise<>
сначала нулевой элемент генератора1, потом нулевой элемент генератора2 итд
Alex
Alex
если прямо хочешь всю последовательность лениво - напиши генератор с двумя вложенными циклами и yield
koder
Alex
Promise<>
да, вот итертулс идеально подойдет
koder
а, я понял
koder
ок
Alex
в 2.x был itertools.izip
Евгений
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
что то типо такого?
Alex
Aragaer
нет, там есть другое
koder
koder
сча
Aragaer
>>> list(itertools.chain.from_iterable(zip('abc', 'def', 'xyz')))
['a', 'd', 'x', 'b', 'e', 'y', 'c', 'f', 'z']
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
простой чейн может сплющить список кортежей в просто список, а фром итерабл может достать их из зипа
Alex
>>> list(itertools.chain.from_iterable(zip('abc', 'def', 'xyz')))
['a', 'd', 'x', 'b', 'e', 'y', 'c', 'f', 'z']
как вариант
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('abc', 'defg', 'hij')))
Promise<>
Alex
это если нужен честный обход генераторов по очереди. если нет - вон выше пример от @aragaer однострочник
Alex
только учти что zip обходит последовательности пока хотя бы одна из них не закончится (т.е. работает по самой короткой последовательности)
Promise<>
А возможно ли сделать по самой длинной?
Alex
itertoos.zip_longest обходит по самой длинной последовательности
Alex
подставляя значения fillvalue аргумента вместо тех что уже знакончились
Promise<>
Примерно такая вот проблема, поэтому хочу использовать лениво
Promise<>
Promise<>
test_obj - словарь со значениями, который мы получаем из циклов
как все циклы завершились => objects['tests'].append(test_obj), добавляем в массив test_obj (куда стрелочка зеленая показывает)
Alex
>>> list(itertools.chain.from_iterable(itertools.zip_longest('abc', 'defg', 'xyz', fillvalue='-')))
['a', 'd', 'x', 'b', 'e', 'y', 'c', 'f', 'z', '-', 'g', '-']
Anonymous
кто напишет чекер соксов ? (географию)
Alex