Этого треда уже нет.
Это копия, сохраненная 5 августа 2022 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Питон тред №135 /python/ 2266995 В конец треда | Веб
Тред, посвящённый языку программирования Питон, #135

Предыдущий: >>2248924 (OP)
Литература:
https://ln2.sync.com/dl/cf2c1d070#xq4s328t-xbbjys2z-9r6j7ss7-gf4e9dv6 <-- Книжки, новое собрание
Ещё книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Больше книжек: https://yadi.sk/d/H-00n-UG3RSQem

Анон, вместо того, чтобы без разметки постить код, лучше шарь его через специальные ресурсы:
https://ideone.com/ - возможность постить листинги кода и онлайн-запуска, не требует регистрации
https://dumpz.org/ - можно постить листинги, не требует регистрации
https://pastebin.com/ - для листингов, регистрация не обязательна
https://www.codepile.net/ - можно расшарить код в том числе на редактирование, особая полезная опция - чат при каждом листинге, где можно код обсудить
https://pyfiddle.io/ - запуск python кода онлайн, но чтобы шарить, надо регистрироваться

#######################################

ЧаВо: https://github.com/TheKnightsWhoSayNi/info/wiki/Hat Актуальность примерно 2015 года

Вопросы-ответы:
— А стоит ли читать Лутца, том номер N?
Мнения в треде разделены. Кто-то за (очень неплохая база даётся), кто-то против (слишком много воды и объём книг убивает всё рвение). В общем — решать тебе, книга вредна не будет, но ты можешь её просто не дочитать и забросить.

— Стоит ли читать %книга_нейм%, если там питон версии 2.х?
Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х

— А что ещё можно читать?
Питон сам по себе очень хорошо задокументирован и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html

— Есть у кого на примете годный курс лекций по алгоритмам? Формат лекций мне как-то ближе, нежели просто чтение книги.
МФТИшный курс, например, https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0

— Что можно почитать/посмотреть по многопоточности/параллелизации в питоне, да и вообще в целом?
Очень годный ролик на американском языке про многопоточность и асинхронность https://www.youtube.com/watch?v=MCs5OvhV9S4

— А как учить джангу? Нахожу только книги по джанге 1.х
У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой из официальной документации.

— В ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать
Вот, пожалуйста, та же самая программа, но переработанная под язык Python: http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)

— Можно ли на питоне делать мобильные приложения?
Да, смотри на фреймворк Kivy https://en.wikipedia.org/wiki/Kivy_(framework) https://kivy.readthedocs.io но народ на него жалуется

— Как можно без лишней возни ускорить программу на питоне
1) проверь сначала свой код, алгоритмы и структуры данных. Чаще проблема здесь.
2) код можно иногда феерично ускорить, используя JIT (Just-in-Time) компиляцию. Почитай обязательно про модуль numba, он ставится через pip, и альтернативный интерпретатор PyPy.

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

ps: анон, если ты вносишь изменения в шапку, оставляй ссылку на код с обновлённым исходником.
Исходник: https://dumpz.org/bASGKD8cCFDf
image.png7 Кб, 593x76
2 2267035
почему так? флаш тот же результат дает
3 2267040
>>67035
Как так?
Аргументы принт вычисляются перед вызовом, врайт отрабатыват и возвращает свой результат, потом отрабатывает принт.
4 2267066
В асинкопитоне есть приоритизация задач эвент лупа из коробки? Или хотя бы либа, которая упрощает это. Есть группа тасок одна из которых должна выполняться только когда остальные ждут/завершены. Пока сделал костыль через PriorityQueue, но он мне не нравится.
5 2267090
>>67066
Раздели их и всё. Группу делай в асинхронном режиме, а после неё синхронный. В conqurrent можно это обернуть без необходимости делать омерзительные асинхронные методы:
ex1=execute(task1, args)
ex2=execute(task2, args)
task3(args, ex1.ready())
6 2267091
>>67035
У тебя выполняется стдаут на этапе загрузки параметров в принт и даёт какой-то результат.
Ничего удивительного тут нет
image.png74 Кб, 698x305
7 2267105
двач, поясни пожалуйста за super()
насколько я понял, он проксирует запросы к базовому классу, который определяется в порядке mro. если вызвать super() без аргументов, то это будет эквивалентно super(MyClass, self), и запросы к базовому классу буду проксироваться через self, т.е. в __init__, напиример, явно не нужно будет передавать self. На этом этапе все понятно, проблемы с пониманием у меня начинаются в тот момент, когда в качестве второго аргумента передается не объект, а тип.
Пример: если я переопределяю __new__, то в конце обычно пишут что то типо return super(MyClass, cls).__new__(cls, args, *kwargs)
Так вот, почему обязательно нужно указывать cls в качестве первого аргумента? Разве не должно произойти проксирование от лица cls, как в примере с __init__?
на пике аналогия с методом класса, и там это работает, как ожидается
получается __new__ -- не метод класса?
8 2267121
Обзмеился
9 2267138
>>67090
У меня потребности немного другие, в твоем случае таска 3 не начнется до тех пор пока не завершится первая. Распишу подробнее.
Условно, есть бесконечная таска-продюсер, которая генерирует некоторые значения и кладет их в массив до тех пор пока он не будет заполнен (в моем случае это asyncio.Queue и наполняется оно через await queue.put) и есть таски-консумеры, которые берут значения через await queue.get.
В группу тасок консумеров могут в любой момент добавится еще в любом количестве. Важно, что бы если в массиве есть значения, а консумеры еще не закончились ни в коем случае не запускать таску продюсер (только в случае, если массив опустел, а консюмеры остались), так как она работает гораздо медленнее и соответственно для этого мне и нужны были приоритеты, что бы продюсер запускался только в момент простоев и опустощения массива.
10 2267181
Чуваки,всем чая,пирогов итд.Вопрос к тем кто уже работает разрабом.Кто как учился,как попали на работу.Учили в универе,учились сами или на курсах?Какие проекты делали для резюме итд.Просто взял себе курсы,вроде как неплохие(не жидбрейнс и израэльбокс) и вот думаю мб все таки пытаться самому.
11 2267192
>>67105
new это статический метод, который именно создает новый объект, поэтому нужен тип. А init уже настраивает этот созданный в new объект, поэтому он уже знает, что это за класс.
12 2267302
>>67192
да, это я в курсе, просто не очевидно было, что new это статический метод
13 2267304
>>67138
threading.Condition, не?
14 2267343
>>67138
Тут приоритеты не помогут. Нужны примитивы синхронизации. Тебе нужна третья синхронная? таска, контроллер, которая будет периодически (или может после каждой таски из обеих групп, но тогда это проще декоратором сделать, а не новой таской) запускаться, проверять выполнено ли условие (первая группа тасок завершило выполнение) и менять глобальный лок. Потом в зависимости от значения глобального лока вызывать таски одной из двух групп. Можно просто на все таски кастомный декоратор, который выполняет её только при определёном значении лока, а меняет значение лока только таска контролер. Вместо лока можно кондишионал вариэйбал использовать как>>67304 этот анон посоветовал. Возможно так даже поконсистентней будет.
15 2267346
А у вас на работе тайпхинты использую?
16 2267361
>>67343
>>67304
Я решил еще попробовать тупо в лоб решить без всякого тюнинга просто создавая задачи через create_task внезапно оказалось, что таски выполяются в том порядке, что я и хочу, лишнего вызова генерации посреди сбора данных не происходит, все последовательно. Пошел курить статьи по работе эвентлупа.
17 2267433
>>67181
Мехатронщик. Сам учил в пассивном режиме, т.к лет 10 так или иначе кодил что-то, алгоритмы разной степени сложности, логику плк.
На резюме просили делать простые серваки, микросервисы, генерация токенов, менедж файлов, пикч и тд.

Если до этого вообще не связывался с информатикой, то наверное лучше курсы.
18 2267435
>>67433
Нашёл работу через месяца два примерно, т.к с вебом вообще не знаком был
Flask vs Quart (Будущее за асинхронностью) 19 2267453
Вот вы мне скажите, во всех туториалах, книгах, иных источниках информации (по крайней мере тех что я читал) для создания микроприложений (API, microblog) используется Flask или, упаси боже, Django, но нахуя!? Они же не поддерживают асинхронность (я знаю что Django поддерживает, но для выбранных задач это как из пушки по воробьям), я понимаю что так видетели проще, но зачем заранее учить новичков плохому? Flask конечно хорош, но при расширении с ним всё будет виснуть, так скажите мне, прогромисты 300$/наносек. Нахуя!? Где альтернативы синхронным микро-фраймворкам!? (Прошу прощения за плохую орфографию, слегка пьян.)
20 2267455
>>67453
Мне кажется сначала лучше понять REST, нежели и REST и асинхронность сразу. А если новичок не знает ещё чего-то, например работу с БД, ORM, то ещё больше информации новой приходится узнавать
21 2267460
>>67455
Я понимаю, образование (буду его так называть) должно быть простым, но не в ущерб качеству будущих продуктов, REST понять можно за пару часов на всем известном сайте (https://www.restapitutorial.com/), тем более, разве не движок важнее всего? Скорость принятия и обработки запросов является чуть-ли не основополагающей проблемой при работе с большим кол-вом запросов (>10к/s к примеру), а сейчас заказчики просят чуть-ли не 80к/сек, для проектов стоимостью меньше 20к!
22 2267462
>>67453
Пиздос, а до моды на асинхронность, которой от силы лет десять, как люди жили вообще? По домофону сайты грузили, сука.
23 2267465
>>67462
Лет 10 назад запросы были меньше, по части скорости и кол-ву, так сказать что невидимо невооруженому взгяду - то асинхронно (Делитанское дерьмо, знаю, но звучит прикольно)
24 2267472
>>67465
Точно так же решалось, как и сейчас - балансировкой нагрузки.
25 2267474
>>67472
Разве не выгодней сразу сделать приложение, которое способно выдерживать большие нагрузки, чтобы не тратиться на создание инстансов на других серверах, чем создать вроде-как простое приложение, но не способное выдерживать большие нагрузки?
26 2267476
>>67474
В разумных пределах, если это не мешает работе. Про вред преждевременной оптимизации почекай как-нибудь статейки или еще чего.
27 2267478
>>67476
Разве автоматическое задумывание на будущее является чем то плохим? (Я понял про разумные пределы, я имею ввиду про некое злоупотребление)
28 2267530
>>66995 (OP)

>2022 год


>использовать синхронные драйверы для коннекта в БД


Вы че, пистонисты бля, совсем гавном зажрались уже?
29 2267586
>>67453
Сейчас все асинхронные фреймворки по сути напоминают тот же фласк
30 2267619
Существуют ли в джанго шаблоны и пилят их вообще? Например, как в dle. Чтобы просто поставить, накатить шаблон и уже готовый сайт. Или надо типо скопировать шаблон, расставить все в шаблонизаторе.
31 2267646
>>67453
Если приложение получит пользу в производительности от перехода с синхроного на асинхроный формат, то это значит, что там слишком много ио операций и оно так же получит прирост перфоманса от увелечения количества тредов. В гуникорне можно просто задать оверкомит 8 тредов процесс и по одному процессу на ядро процессора. Плюс буферизация и распределение нагрузки в энджинксе если есть долгие и быстрые запросы. И на очень долгих селари. Этого достаточно чтобы код поддерживал тысячи запросов в секунду на одном инстансе. Причём на малом количестве запросов в несколько сотен например такой код быдет быстрее асинхроного т.к. не надо на каждый чих контекст в ивентлупе менять. С большим количеством запросов этот вариант не справиться, а асинхроный переварит ценой понижения перфоманса. В этом похоже и трейдоф. Хочешь быстро приложение делай синхроно. Хочешь чтобы паралельно много юзеров на одном инстансе сервилось делай асинхроно. Это уже вопрос экономии. А на инстансах нет особого смысла экономить тогда месяц аренды одного инстанса стоит как час работы одного спеца по асинхронщине. Поэтому видимо бизнес и не спешит переходить на асинхроные фреймворки
32 2267651
>>67646
Как же ты филигранно размотал этого маленыша...
33 2267733
Сижу компилирую cpython, какие подводные камни?
34 2267774
>>67733

>какие подводные камни?


Тебе это рили нужно или просто на хайпе?
35 2267776
>>67646

>Причём на малом количестве запросов в несколько сотен например такой код быдет быстрее асинхроного т.к. не надо на каждый чих контекст в ивентлупе менять


Нужно всего лишь менять тред каждые 100 мс вне зависимости от того, есть ли в нем выполняемая нагрузка или нет. Соответственно, если у тебя висит 20 тредов, а задача только в половине, то процесс будет замедлен в два раза просто из-за необходимости ожидания. Треды для IO можно использовать только в языках где поддерживаются нормальные треды, а не GIL.
36 2267781
>>67776
Чуть обосрался, не 100мс, а нс, но сути не меняет
37 2267810
>>67776
АРЯЯЯ ДИДЫ ТАК ДЕЛАЛИ И НАМ ЗАВЕЩАЛИ! ЯСНО??
38 2267819
>>67776
питон при работе с каждым новым питонобджект отпускает гил. А ещё при созвании сокета в входа в сишную библиотеку. Поэтому питон релизик гил достаточно часто чтобы скедулер ос за одну милисекунду успел пройтись по всем тредам несколько раз. Плюс в фласке более 90 процентов времени тред ждёт. Поэтому процесс питона почти всегда будет выполнять тред, который не ожидает ио. Тут главное не создавать лишних тредов чтобы вечное переключение контекста его не стало замедлять. 8 в процессе эмпирически выглядит хорошо. Но тут надо подгонять под каждый проект.
39 2267845
>>67774
Хачю кейворды поменять
40 2267871
>>67819

>Поэтому питон релизик гил достаточно часто чтобы скедулер ос за одну милисекунду успел пройтись по всем тредам несколько раз.


В любом случае, переключение треда гораздо дороже, чем таски в эвентлупе

>8 в процессе эмпирически выглядит хорошо. Но тут надо подгонять под каждый проект.


Только если у тебя нет походов на сторонние сервисы/в сеть, а сам инстанс ходит только в базу/память без тяжелых запросов. Иначе треды запнутся о 100 мс задержку на стороннее апи и приложение сдохнет без заливания дополнительными инстансами. В мелких проектах норм, но на чем-то большем начнут приходить неприятные счета за железо.
41 2267874
Что обычно питонят начинающие питухоноводы?
42 2267914
>>67871

>В любом случае, переключение треда гораздо дороже, чем таски в эвентлупе


Да дороже. Но таски в ивентлупе переключаются чаще. 2 таск на 80 процентов состоящие из ио ожидания по 50 мс в двух тредах законачаться примерно через 50 мс, а в ивентлупе примерно за 60 мс. То есть выполняя простую операцию в треде тебе не нужно прерывать его каждый раз когда авэйт вызвается чтобы переключиться на другую таску. Там неявно вызывается релиз гила, но такой же релиз и в тасках с ивентлупом происходит. Так что ивентлуп помогает обслуживать больше одновременных запросов на том же железе за счёт небольшого увеличиния его времени выполнения.

>Только если у тебя нет походов на сторонние сервисы/в сеть, а сам инстанс ходит только в базу/память без тяжелых запросов.


Нет. Это неправда. Гил релизится на открытие сокета. То есть выполняя 2 запроса к внешнему апи в двух разных тредах по 100 мс они оба после открытия сокетов отпустят гил и выполнятся за 100 мс. Тут нет просадки пока не делаешь сотни запросов на один реквест. Но даже для этого есть оптимизация не требующая явного переписывания кода проекта на асинхроный мод.

> В мелких проектах норм, но на чем-то большем начнут приходить неприятные счета за железо.


Нет. В больших тоже годится. Вот возьми время ответа 40-50 мс. Это без учёта времени пинга и работы энджинкса т.к. они не влияют на работу треда. Это только время окупации треда. Если там время дольше, то таску можно перенаправить в селарии, доставаться значения из кэша вместо явного вызова каждый раз или как-нибудь ещё оптимизировать и тогда время станет снова 40-50 мс. И возьмём средний такой инстанс на 8 цп с 8 тредами на процесс за 20 центов в час. Это где-то 150 долларов на 1500 запросов в секунду. 10 запросов в секунду за каждый доллар. Для маленьких приложений это норм цена т.к. пока цена 5к доларов не привысит (зп одного разраба) можно не заморачиваться оптимизацией и скэйлить. А это 50к запросов в секунду. Потом уже можно заняться оптимизацией эндпоинтов, тюнингом параметров и править архитектуру клауда чтобы при тех же расходах держать в нескольк раз больше запросов в секунду. Так можно 100-200 тысяч запросов в секунду выдать почти не тратясь на облако при эффективности 20-40 запросов в секунду. Если прям очень надо выдать эффективности в сотню и больше запросов в секунду на доллар, то пора вводить асинхронность. И то в таком случае лучше вынести кретический функционал в микросервисы и переписать их на го ля большего выхлопа, чем поддерживать одновремено фласк и фастапи какой-нибудь. И вот тогда может и будет проект поддерживать сотни тысяч запросов в секунду на кластере ценой в пару десятков тысяч долларов. Но там вылазят проблемы другого масштаба и просто асинхроность тут не достаточно. Всякие фастапи полезны когда поднимаешь всего 3 инстанса (балансировщик, основной и резервный серверы) и хочешь как можно скорее новый код в продакшен и чтобы он справлялся с тысячами пришедших пользователей одновремено ценой скорости работы.
42 2267914
>>67871

>В любом случае, переключение треда гораздо дороже, чем таски в эвентлупе


Да дороже. Но таски в ивентлупе переключаются чаще. 2 таск на 80 процентов состоящие из ио ожидания по 50 мс в двух тредах законачаться примерно через 50 мс, а в ивентлупе примерно за 60 мс. То есть выполняя простую операцию в треде тебе не нужно прерывать его каждый раз когда авэйт вызвается чтобы переключиться на другую таску. Там неявно вызывается релиз гила, но такой же релиз и в тасках с ивентлупом происходит. Так что ивентлуп помогает обслуживать больше одновременных запросов на том же железе за счёт небольшого увеличиния его времени выполнения.

>Только если у тебя нет походов на сторонние сервисы/в сеть, а сам инстанс ходит только в базу/память без тяжелых запросов.


Нет. Это неправда. Гил релизится на открытие сокета. То есть выполняя 2 запроса к внешнему апи в двух разных тредах по 100 мс они оба после открытия сокетов отпустят гил и выполнятся за 100 мс. Тут нет просадки пока не делаешь сотни запросов на один реквест. Но даже для этого есть оптимизация не требующая явного переписывания кода проекта на асинхроный мод.

> В мелких проектах норм, но на чем-то большем начнут приходить неприятные счета за железо.


Нет. В больших тоже годится. Вот возьми время ответа 40-50 мс. Это без учёта времени пинга и работы энджинкса т.к. они не влияют на работу треда. Это только время окупации треда. Если там время дольше, то таску можно перенаправить в селарии, доставаться значения из кэша вместо явного вызова каждый раз или как-нибудь ещё оптимизировать и тогда время станет снова 40-50 мс. И возьмём средний такой инстанс на 8 цп с 8 тредами на процесс за 20 центов в час. Это где-то 150 долларов на 1500 запросов в секунду. 10 запросов в секунду за каждый доллар. Для маленьких приложений это норм цена т.к. пока цена 5к доларов не привысит (зп одного разраба) можно не заморачиваться оптимизацией и скэйлить. А это 50к запросов в секунду. Потом уже можно заняться оптимизацией эндпоинтов, тюнингом параметров и править архитектуру клауда чтобы при тех же расходах держать в нескольк раз больше запросов в секунду. Так можно 100-200 тысяч запросов в секунду выдать почти не тратясь на облако при эффективности 20-40 запросов в секунду. Если прям очень надо выдать эффективности в сотню и больше запросов в секунду на доллар, то пора вводить асинхронность. И то в таком случае лучше вынести кретический функционал в микросервисы и переписать их на го ля большего выхлопа, чем поддерживать одновремено фласк и фастапи какой-нибудь. И вот тогда может и будет проект поддерживать сотни тысяч запросов в секунду на кластере ценой в пару десятков тысяч долларов. Но там вылазят проблемы другого масштаба и просто асинхроность тут не достаточно. Всякие фастапи полезны когда поднимаешь всего 3 инстанса (балансировщик, основной и резервный серверы) и хочешь как можно скорее новый код в продакшен и чтобы он справлялся с тысячами пришедших пользователей одновремено ценой скорости работы.
43 2267948
Если мы сделаем с Джанго-моделью вот это:

avatar.status = 'ready'
avatar.status = 'pending'
avatar.save()

То на моменте вызова save мы отправим 1 запрос (последний) или отправим несколько запросов на UPDATE поля status?
44 2267961
>>67914

>То есть выполняя 2 запроса к внешнему апи в двух разных тредах по 100 мс они оба после открытия сокетов отпустят гил и выполнятся за 100 мс.


Это только работает только во время инициализации запроса, если при следующем переключении он будет продолжать ожидать, то там потребуется те же 100 нс без полезной нагрузки.

>то таску можно перенаправить в селарии


То есть использовать сторонний таск менеджер и получить дополнительный расход на загрузку и выгрузку задачи по которой ответ придет в течении 100-200 мс. Причем паралеллизм достигается за счет закидывания процессами, которые имеют такие же ограничения. Да и целом, речь шла о мультитрединге против асинхронности, процессы подключить и к асинхронному коду можно.

>доставаться значения из кэша вместо явного вызова каждый раз или как-нибудь ещё оптимизировать и тогда время станет снова 40-50 мс


>как-нибудь


А если никак-нибудь? Запросы не выдают один и тот же результат и поэтому их нельзя закешировать. Любая интеграция с крупным продуктом скорее всего породит такие проблемы.

>Вот возьми время ответа 40-50 мс


Нет, не возьму, даже запрос гугловой статики размазанной по куче CDN размером 1кб с главной страницы занимает 50 секунд и это без полезной нагрузки. У нас до главного поставщика данных запрос идет 300 мс, соответветственно дальнейшие расчеты можно не смотреть.
45 2267962
>>67961

>занимает 50 милисекунд


фикс
46 2267964
>>67619
ап

Еще тоже такой вопрос. Есть вообще цмски на питоне похожие на дле где есть многое из коробки, например, шаблоны.
47 2268022
>>67948
Отправится только один запрос UPDATE (при выполнении строки с save).
48 2268041
49 2268057
>>68041
Я знаю об этой цмске, там есть шаблоны, комунити пилит шабы или нет? А то придется вручную расставлять в шаблонизаторе.
50 2268064
>>68057
Комунити, проект то опен сорсный
51 2268216
Интересует подход к реализации бекэнда.

Например, надо сделать запрос на другой ресурс и записать результаты в базу.
Это будут два отдельным метода, типа сделать запрос и записать в базу. Или один, который будет реализован в виде метода соответствующей модели?
Конечно, это всё для примера. В реальных ситуациях запросов и записей гораздо больше.

Независимые методы, но громоздкая бизнес логика. Или же специальные методы, но простая бизнес логика.
Какой подход обычно вы используете и какой считаете оптимальным?
Только не утопическая золотая середина.
52 2268292
>>67914

>10 запросов в секунду за каждый доллар


Ещё трафик надо добавить, 10 запросов в секунду это 250 миллионов запросов в месяц, от 50 до 1000 гигабайт трафика. Тариф там что-то около 10 центов за гигабайт, соответственно к этому доллару надо добавить ещё 5-100. Зависит от тажеловесности запроса.
53 2268298
>>67914
Неохота вникать, но не понимаю, в чём проблема с использованием асинхронности.

Ожидание данных в асинхронности основано на select принципе, используются аналогичные системные вызовы. Соответствующая таска получит управление только тогда, когда на сокет придут данные. Что принципиально отличает историю от сокетов.

Поэтому всё работает очень быстро. И ресурсы потребляются небольшие.

Один процесс питона спокойно может обслуживать тысячи одновременных соединений. При условии, что там данных немного, конечно, что один процесс в принципе такой объём данных может обработать.

Сейчас при работе с сетью использовать треды в питоне в принципе несерьёзно, только asyncio и всё, без вариантов.
54 2268302
>>68298
А если задачи последовательны и каждый этап зависит от предыдущей?
Вообще любой вызов сервера это в большинстве случаев именно последовательные задачи.
Если один вызов делает кучу разных независимых задач, то может лучше их разбить на несколько, а не делать всё в один клик?
Асинхронность нужна на фронте. В беке она нахуй не упёрлась.
55 2268353
>>68302

>А если задачи последовательны и каждый этап зависит от предыдущей?


>Вообще любой вызов сервера это в большинстве случаев именно последовательные задачи.



И что? IO там меньше не становится, суть не в том, что бы обслужить не один, а множество запросов.
56 2268375
Избранное
57 2268401
>>68302
Асинхронность и синхронность - это тупо разные стеки. Разные модули, функции, разная работа с ними.

Если ты умеешь в асинхронность, то будет просто работать. Если ты планируешь работать с сетями, то асинхронность надо уметь.

Сложно асинхронность с gui стыковать.
58 2268403
>>68401

> Сложно асинхронность с gui стыковать.


С чего бы? Там изначально ивент луп, а если хочешь, чтобы оно не фризилось на тяжелых операциях, то надо хуярить треды или асинхронщину. Так что никто синхронно и не пишет.
59 2268408
>>68403
Асинхронность в питоне это asyncio. Гуи в основном асинкио не поддерживают, они на базе тредов. И тебе придётся какой-то геморой пройти, запускать asyncio event loop в отдельном треде, потом организоыввать обмен данными между разными тредами и т.п. В общем не очевидно там всё.
60 2268414
>>68408
Ну я в целом про гуи, а не про питон.
На питоне писать гуи это в любом случае изврат.
61 2268438
>>68353
Но ведь это делает сам сервер...
62 2268440
>>68438
А бизнес логику у тебя тоже nginx делать будет?
63 2268441
>>68440
В бизнес логике всё линейно. Что же вы там делаете такого, для чего чуть ли не весь код приходится делать асинхронным.
64 2268442
>>66995 (OP)
Всем привет, уважаемые заклинатели змеи, накачал книг по питону, возник вопрос, с какой стоит начать, какой продолжить? Какие-то может быть лишние?
Изучаем питон Марк Лутц ( и его же карманный справочник)
Аллен Б. Дауни Основы питона. Научитесь думать как программист
Кристиан Майер Однострочники питон
Билл Любанович Простой питон. Современный стиль программирования

На данный момент за плечами курс поколение питон для начинающих и полкурса поколение питон для продвинутых на степике
65 2268445
>>68441
А если два запроса придет? А три? А тысяча? И везде то поход в базу, то в другой сервис, то на сторонние АПИ
66 2268451
>>68445
Если придёт два запроса сервер сам создаст инстанс. На сторонние апи можно отправить от силы пару запросов параллельно, таких мест очень мало. Часто следующий запрос зависит от предыдущего.
Если придёт тысяча, есть celery и aws sqs.

Всё ещё не понимаю для каких задач бек нужно делать асинхронным.
67 2268460
>>68451

>Если придёт два запроса сервер сам создаст инстанс


Это хорошо, если у тебя нагрузка ограничивается двумя запросами одновременно

>celery


Ну то есть для тебя прикрутить многопроцессорную залупу с необходимостью дополнительного брокера и расходами на передачу туда данных это заебись, а воспользоваться нативной функциональностью языка, которая для этого была создана и более оптимально расходует сетевые ресурсы это НИНУЖНА?
Это как юзать сортировку пузырьком и говорить что нахуй этот тимсорт нужен, работает же.
68 2268462
Сап! Надо автоматизировать действия в Discord с множества аккаунтов, есть аноны, готовые взяться за эту задачу?
69 2268463
Сап! Надо автоматизировать действия в Discord с множества аккаунтов, есть аноны, готовые взяться за эту задачу?
70 2268474
Сап! Надо автоматизировать действия в Discord с множества аккаунтов, есть аноны, готовые взяться за эту задачу?
71 2268483
>>68460
Для асинхронного кода надо переписывать методы и менять логику.
Для celery надо просто закинуть данные в очередь.
72 2268496
>>67961
Я вернулся и готов продолжать.

>Это только работает только во время инициализации запроса, если при следующем переключении он будет продолжать ожидать, то там потребуется те же 100 нс без полезной нагрузки.


Нет. Обычный запрос во внешний апи это 99 процентов ожидание результата. То есть 2 треда с разнице ну может миллисекунду делает ревест во внешний апи, а потом отдновремено ждут результата. Поэтому такой кейс нормально паралелится тредами.

>То есть использовать сторонний таск менеджер


Таков путь. Ивентлуп или селари всё равно что-то придётся использовать. Без него бэкенд не полноценен.

>получить дополнительный расход на загрузку и выгрузку задачи по которой ответ придет в течении 100-200 мс


Не уверен о чём ты. Особености селари видны на очень долгих запросах. Если обычный запрос справляется за 30мс, то нет смысла ставить селари, а если там какая-нибудь долгая выгрузка объекта из с3 например, которая 200мс работает, то тогда стоит отправить запрос в селари и тред потрати время только на инициализацию таски всего 10мс и сможет следующий реквест хэндлить. Особеность асинхронщины, что этот запрос обрабатывался бы те же 200мс, но при этом несколько раз в одну мс менял бы контекст, переключался бы на другие реквесты, застревал бы в цпу баунд тасках других реквестов и общее время ответа сервера было бы не 200, а 250мс например.

>Да и целом, речь шла о мультитрединге против асинхронности, процессы подключить и к асинхронному коду можно.


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

>А если никак-нибудь?


Там перед как-нибудь было или. То есть перенос таски в селари точно поможет. Или могут быть другие более эффиктивные способы. Вынести например эти запросы в микросервис, хотябы с односекундным ттл может и можно кэшировать. То есть варианты оптимизации есть. Но даже если нет, то возвращаешь на такой долгий запрос 202 код и переносишь таску в селари. Это 100 процентов сократит время окупации треда до пары десятков мс.

> У нас до главного поставщика данных запрос идет 300 мс


Это ты время пинга учитываешь. Я говорю про время, котоое тред занят и не может принимать другие реквесты. Время пинга со стороны бэкенда никак не уменьшить. Тот же cdn очень быстро тебе результат отдаст. Файлик у него скорее всего в раме зэкеширован и меньше, чем за одну мс он его вернут. А всё остальное время потратится на передачу данных по сети. Вот как раз синхроность уменьшает время обработки запроса на сервере в том время как асинхроность увеличивает количество рпс. Это основной технический трейдофф. На принятие решения внедрять ли асинхроность ещё может влиять как сложно будет бизнесу переписать имеющейся код и стоит ли результат этого. Плюс если проект пишут с нуля, то могут подумать о ноде или го. Только если уже есть питоновская команда могут начать думать над новым проектом с фастапи. Ну и другие бизнесовые аспекты наверняка есть. Иммено поэтому асинхроность сейчас не такая популярная, но медленно набирает популярность в новых проектах
72 2268496
>>67961
Я вернулся и готов продолжать.

>Это только работает только во время инициализации запроса, если при следующем переключении он будет продолжать ожидать, то там потребуется те же 100 нс без полезной нагрузки.


Нет. Обычный запрос во внешний апи это 99 процентов ожидание результата. То есть 2 треда с разнице ну может миллисекунду делает ревест во внешний апи, а потом отдновремено ждут результата. Поэтому такой кейс нормально паралелится тредами.

>То есть использовать сторонний таск менеджер


Таков путь. Ивентлуп или селари всё равно что-то придётся использовать. Без него бэкенд не полноценен.

>получить дополнительный расход на загрузку и выгрузку задачи по которой ответ придет в течении 100-200 мс


Не уверен о чём ты. Особености селари видны на очень долгих запросах. Если обычный запрос справляется за 30мс, то нет смысла ставить селари, а если там какая-нибудь долгая выгрузка объекта из с3 например, которая 200мс работает, то тогда стоит отправить запрос в селари и тред потрати время только на инициализацию таски всего 10мс и сможет следующий реквест хэндлить. Особеность асинхронщины, что этот запрос обрабатывался бы те же 200мс, но при этом несколько раз в одну мс менял бы контекст, переключался бы на другие реквесты, застревал бы в цпу баунд тасках других реквестов и общее время ответа сервера было бы не 200, а 250мс например.

>Да и целом, речь шла о мультитрединге против асинхронности, процессы подключить и к асинхронному коду можно.


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

>А если никак-нибудь?


Там перед как-нибудь было или. То есть перенос таски в селари точно поможет. Или могут быть другие более эффиктивные способы. Вынести например эти запросы в микросервис, хотябы с односекундным ттл может и можно кэшировать. То есть варианты оптимизации есть. Но даже если нет, то возвращаешь на такой долгий запрос 202 код и переносишь таску в селари. Это 100 процентов сократит время окупации треда до пары десятков мс.

> У нас до главного поставщика данных запрос идет 300 мс


Это ты время пинга учитываешь. Я говорю про время, котоое тред занят и не может принимать другие реквесты. Время пинга со стороны бэкенда никак не уменьшить. Тот же cdn очень быстро тебе результат отдаст. Файлик у него скорее всего в раме зэкеширован и меньше, чем за одну мс он его вернут. А всё остальное время потратится на передачу данных по сети. Вот как раз синхроность уменьшает время обработки запроса на сервере в том время как асинхроность увеличивает количество рпс. Это основной технический трейдофф. На принятие решения внедрять ли асинхроность ещё может влиять как сложно будет бизнесу переписать имеющейся код и стоит ли результат этого. Плюс если проект пишут с нуля, то могут подумать о ноде или го. Только если уже есть питоновская команда могут начать думать над новым проектом с фастапи. Ну и другие бизнесовые аспекты наверняка есть. Иммено поэтому асинхроность сейчас не такая популярная, но медленно набирает популярность в новых проектах
73 2268499
>>68292
В обоих режимах трафик на реквест будет одинаковый. Там только количество ресурсов съедаемых реквестом будет разным. То есть если ты за 10 долларов делаешь 100 рпс, то плати ещё долар сверху за трафик, а если 200 рпс, то ещё 2 долара сверху за трафик. Это для примера, но расходы трафика растут линейно с увеличением рпс. Поэтому в метрику рпс на доллар его сложно добавить. Да не надо наверно. типа если у тебя 10к запросов в секунду и ты тратишь Х доларов на трафик, то для синхроного кода тебе нужно 5 вмок, а для асинхроного одна и тоже Х доларов на трафик.
74 2268501
>>68298

>Неохота вникать, но не понимаю, в чём проблема с использованием асинхронности.


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

>Соответствующая таска получит управление только тогда, когда на сокет придут данные.


Не правда. Таска получит контроль только тогда когда другая кооперативная таска отпустит поток выполнения и ивентлуп решит вернуть контроль таске этой таске работающей с сокетом

>И ресурсы потребляются небольшие.


Скорее не потребляются небольшие, а ютилизируются помаксимуму. Небольшое использование ресурсов это скорее про масштабируемости асинхроных сервисов

>Сейчас при работе с сетью использовать треды в питоне в принципе несерьёзно, только asyncio и всё, без вариантов.


Не обязательно. Бывают таски, где надо опрасить несколько сервисов и тогда время её выполнения это время завершения самого долгого реквеста. Асинкио ещё больше увеличит это время за счёт оверхеда если на каждый реквест ещё какой-нибудь парсинг джисона делать надо. Хотя большинству бизнесов наверно всё равно в селари запихнуть эту таску или в ивентлуп. Что проще прямо сейчас реализовать то и сделают
75 2268505
Асинхронные срачи. Мои любимые.
Еще и goвноедов вспомнили, мм
76 2268622
>>68501

>Не правда. Таска получит контроль только тогда когда другая кооперативная таска отпустит поток выполнения и ивентлуп решит вернуть контроль таске этой таске работающей с сокетом


Переключение задачи возможно только на операции await. Это скорее плюс, тебе почти не нужно думать о race condition, которые в тредах могут возникнуть по любому поводу.

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

Асинкио в принципе удобнее, хотя есть проблема с тем, чтобы встроить его в другие фреймворки. Если ты работаешь внутри фреймворка, вроде GUI, которые все сами по себе фреймворки, или джанго, то их стыковать с асинкио может быть тяжело. Но если делаешь что-то с нуля, то проще с асинкио сразу.
77 2268655
>>68622

>Переключение задачи возможно только на операции await. Это скорее плюс, тебе почти не нужно думать о race condition, которые в тредах могут возникнуть по любому поводу.


Да. Про это и говорю. И рэйсы в асинио возможны.

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


Нет. Ивентлуп ничего не знает про то что ты там выполняешь в таске. У него был вызов авэйта при открытии сокета он и переключился, отправив твою таску с сокетом в очередь с ожидающим стейтом. Когда очередь придёт он начнёт её выполнять. Снова наткнётся на код с чтением сокета, увидет, что чтение не закончилось и снова в очередь. Так пока не закончатся данные литеть (это если тсп сокет). Тут ивентлуп не может волжебным образом узнать что там внутри тасок и когда переключаться. Поэтому он почти рандомно прыгает между авейтами пока не найдёт код, который можно выполнять.

>Асинкио в принципе удобнее, хотя есть проблема с тем, чтобы встроить его в другие фреймворки. Если ты работаешь внутри фреймворка, вроде GUI, которые все сами по себе фреймворки, или джанго, то их стыковать с асинкио может быть тяжело. Но если делаешь что-то с нуля, то проще с асинкио сразу.


Да удобно. Да просто. Но только с инженерной точки зрения и в малых масштабах. Годно оно для пета, внутренней разработке или какого-нибудь легенького скрапера/коннектора/агрегатора/тулзы для автотеста, которые в продакшен не пойдут. А для продакшена: нет инструментов, есть оверхед на частое переключение контекста, на новых проектах работает меньше людей, чем на старых и когда создают новый проект, то не только фреймворк выбирают, но и язык. Поэтому как соискателю шансов нарваться на проект, где это нужно меньше, чем на проект с тредами. А как бизнесу есть тысяча поводов подумать нужно ли что-то делать с асинкио. Отсюда и низкая скорость принятия этой технологии. И никакие рассказы программистов про то, что это волшебство доступное из коробки не помогут
77 2268655
>>68622

>Переключение задачи возможно только на операции await. Это скорее плюс, тебе почти не нужно думать о race condition, которые в тредах могут возникнуть по любому поводу.


Да. Про это и говорю. И рэйсы в асинио возможны.

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


Нет. Ивентлуп ничего не знает про то что ты там выполняешь в таске. У него был вызов авэйта при открытии сокета он и переключился, отправив твою таску с сокетом в очередь с ожидающим стейтом. Когда очередь придёт он начнёт её выполнять. Снова наткнётся на код с чтением сокета, увидет, что чтение не закончилось и снова в очередь. Так пока не закончатся данные литеть (это если тсп сокет). Тут ивентлуп не может волжебным образом узнать что там внутри тасок и когда переключаться. Поэтому он почти рандомно прыгает между авейтами пока не найдёт код, который можно выполнять.

>Асинкио в принципе удобнее, хотя есть проблема с тем, чтобы встроить его в другие фреймворки. Если ты работаешь внутри фреймворка, вроде GUI, которые все сами по себе фреймворки, или джанго, то их стыковать с асинкио может быть тяжело. Но если делаешь что-то с нуля, то проще с асинкио сразу.


Да удобно. Да просто. Но только с инженерной точки зрения и в малых масштабах. Годно оно для пета, внутренней разработке или какого-нибудь легенького скрапера/коннектора/агрегатора/тулзы для автотеста, которые в продакшен не пойдут. А для продакшена: нет инструментов, есть оверхед на частое переключение контекста, на новых проектах работает меньше людей, чем на старых и когда создают новый проект, то не только фреймворк выбирают, но и язык. Поэтому как соискателю шансов нарваться на проект, где это нужно меньше, чем на проект с тредами. А как бизнесу есть тысяча поводов подумать нужно ли что-то делать с асинкио. Отсюда и низкая скорость принятия этой технологии. И никакие рассказы программистов про то, что это волшебство доступное из коробки не помогут
78 2268720
Tornado vs node js кто эффективней?
79 2268724
>>68720
Не набрасывай
80 2268867
>>68720
drogon-core
81 2268874
>>68720
Это же старьё
82 2268930
>>68655

>Нет. Ивентлуп ничего не знает про то что ты там выполняешь в таске. У него был вызов авэйта при открытии сокета он и переключился, отправив твою таску с сокетом в очередь с ожидающим стейтом. Когда очередь придёт он начнёт её выполнять. Снова наткнётся на код с чтением сокета, увидет, что чтение не закончилось и снова в очередь.


Ты не понимаешь как работает асинкио.
Чтение из сокета использует системный вызов kqueue в линуксе, select в винде. Это системные вызовы уведомляют систему, что пришли данные на сокет. Пока данные не придут, задача будет в idle состоянии и переключения на неё не будет вообще.
За счёт этого и достигается огромный прирост производительности по сравнению с тредами.
83 2268933
>>68930

> системный вызов kqueue в линуксе


тьфу, kqueue это BSD решение, в линуксе epoll. Но это примерно одно и то же. Смысл именно такой.
84 2269034
>>68930
>>68933
Это один из тех методов, которые гивент патчит чтобы автоматические понимать когда должно переключение контекста делаться. В исходниках сипайтона этого нет. Там весь ивентул это гуляние по таскам, которые до этого вызывали елд фром. Не знаю в каких местах там всё в третьем питоне пропатчено. Возможно ивентлуп и не заходит в таски не получившие ничего на ввод, по это точно часть сетевой либы питона, и на сипайтона, а значит переключение контекста на новую таску для этой проверки всё таки происходит, он быстро видит, что нотифаев нет и переключается дальше. Да оптимизация, но проблемы частой смены контекста не решает
image.png16 Кб, 399x317
85 2269072
Я обязательно вкатотуся.
86 2269100
>>69034

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


Это пофикшено в uvloop, буквально две строчки добавить
87 2269111
>>69072
Не ищи работу,а создай ее сам
88 2269112
>>68442
Нам на стажировке сказали Мэтта Харрисона читать. Хз, насколько она норм.
89 2269115
>>69034
Что ты несёшь?
Работа с сокетом это по-определению только 3-й питон. Без каких-либо патчей использует select-принцип получения данных.

Это есть и в исходниках, и в доках сказано, наконец просто сделай в линуксе strace работающей программы и посмотри на используемые системные вызовы.

Сотню тысяч открытых соединений асинкио держит, я проверял из праздного любопытства. С низкой активностью, конечно. Можешь сам проверить, хотя тут напрячься придётся, чтобы саму систему заставить столько соединений поддерживать на процесс.
90 2269120
>>69100
Естественно подразумевается, что ты используешь API от asyncio, то есть или через протоколы + loop.create_server/loop.create_connection делаешь, или через asyncio.start_server/asyncio.open_connection

но только так с асинкио и работают.
91 2269128
>>69115

>Работа с сокетом это по-определению только 3-й питон. Без каких-либо патчей использует select-принцип получения данных.


Гивент на втором питоне тоже пытается неблокающий ио делать. И у него костыльно, но получается. Точно помню, что он патчит этот самый епол и свитчит контекст на этих операциях.

Не знаю как в третьем питоне это сделано. Могу только предпологать на основе того, что знаю. Думал, что так же как и во втором с гивентом, но теперь нативно. Но видимо как-то по-другому

>>69100
И как там теперь? Просто про бегающий по таскам ивент луп это точно. Прям во внутриностях сипайтона этот алгоритм захардкожен. Что делает ивент луп когда заходит в таску, которая пока не получила ничего в ио? Или он туда по какой-то причине не заходит раньше времени? Объяснишь?
92 2269135
93 2269137
>>69135
Делай прожект сам для себя и зарабатывай
94 2269141
>>69137
Просто и без задней мысли?
Дай денег на проект, кста.
95 2269144
Подскажите по pyodbc.
Смотрю коммитов нет нихуя, хотя по доке вызываю коммит на connection.
Погуглил, вот у чела в каменте чисто такая же хуйня
https://stackoverflow.com/questions/20199569/pyodbc-insert-into-sql

> in my case, cnxn( AKA connection) cnxn.commit() did not work, but I user the exact cursor like cursor.commit()


Благодаря ему починил, но какого хуя? Не могу понять почему так.
96 2269219
>>69128

>Что делает ивент луп когда заходит в таску, которая пока не получила ничего в ио? Или он туда по какой-то причине не заходит раньше времени? Объяснишь?


Он не заходит, таски полностью оборачиваются в epool вызовы
97 2269308
Почему celery пропускает таски? Я отправил 10, а выполнилось 5. При этом они приходят, но просто не выполняются и помечаются как выполненные.
98 2269374
>>69128

>Гивент на втором питоне тоже пытается неблокающий ио делать.


Я сам когда-то это релазизовывал через модуль select, когда мне во втором питоне надо было с несколькими сокетами одновременно работать, а треды не хотелось.

Но asyncio всё поддерживает из коробки. Там другого способа и нет, по идее.

У тебя планировщик не переключит на другую задачу, пока ты явно через await какой-нибудь future ему это не разрешишь.

При этом более быстрая работа с сетью это low-level протоколы. Где ты у тебя планировщик просто вызывает синхронный метод класса-протокола (asyncio.Protocol, data_received(self, data)), когда у тебя данные приходят. Всё это обёрнуто в epoll/select.
99 2269419
>>66995 (OP)
Есть список айдишников одной модели: sections_ids
Мне в Джанго нужно обновить поле в каждой Section, айдишник которой лежит в этом списке. Вроде как очевидно можно пройтись циклом вот так:

for section_id in sections_ids:
----section = Section.objects.get(id=section_id)
----section.status = "executing"
----section.save()

Но блин, по факту тут мы будем высирать уйму sql-запросов, по одному на каждую секцию, а ведь в просто SQL я бы просто скинул batch-update и разом обновил все. Как это нормально сделать в Джанге? (сука, такой стек на проекте, ничего не поделать)
100 2269446
Аноны, хелп, я не пишу на питоне и вообще даже не прогер, но нужен результат работы кода. Онлайн компиляторы нихуя не выдают. Может кто запустить и просто заскринить результаты? (по возможности развернуть на весь экран)
код https://ideone.com/SzTV5s
1) Шаг – 50, конец интервала – 5, точность – 0.1
2) Шаг – 100, конец интервала – 5, точность – 0.05
102 2269498
>>69486
Спасибо огромное!
103 2269556
>>69308
Никто не сталкивался с этим? Уже неделю пытаюсь понять в чём дело. В логах ничего необычного не присходит. Просто не вызывается метод. Даже со включённым ask_late брокер помечает его как выполненный
104 2269592
>>69556
Ну и да, ещё botocore пишет dripped connection, но и на успешные таски он это пишет.
Ещё я concurencyустановил в 1, но всё равно он делает таски в обход ограничения в 1 секунду. Причём выдача настроена на стороне очереди. Хрень происходит какая-то в общем
105 2269832
https://dumpz.org/am46dWRZtk83
Почему не создается архив?
Через консоль винды нормально работает, а питон шлет нахер.
Дебаггер тут if os.system(rar_command) == 0:показывает что возвращается 1 вместо 0 и собственно пиздец.
Это пример из книжки A Byte of Python, только под rar.
106 2269846
>>69832
попробуй установить винду 11. это известный баг, вот здесь есть подробности https://www.cvedetails.com/cve/CVE-2021-028359/
107 2269847
>>69846
Unknown CVE ID
This site only contains valid CVE entries. Rejected or reserved CVE entries are not included in our database. Please visit http://cve.mitre.org and nvd.nist.gov if you think that the CVE entry is missing in our database.
108 2269883
>>69847
Так это из-за несовместимости ОС. Нужно установить винду 11 чтобы открыть страницу.
109 2269886
Прошу прощения, тупая шутка.
Судя по описанию комманды os.system(rar_command) она должна написать в консоль текст ошибки, если была ошибка. Нужно прочитать этот текст и понять в чём именно проблема.
image.png41 Кб, 1112x298
110 2269890
Посмотрел что значит возвращаемый код 1 для винды. Возможно твоя винда не знает тех комманд, которые ты ней передаёшь через os.system(rar_command).
Попробуй на дебаге посмотреть значение переменной rar_command.
Скопировать дословно и ввести в консоль винды эту команду, чтобы проверить.
image.png41 Кб, 1112x298
111 2269891
Посмотрел что значит возвращаемый код 1 для винды. Возможно твоя винда не знает тех комманд, которые ты ней передаёшь через os.system(rar_command).
Попробуй на дебаге посмотреть значение переменной rar_command.
Скопировать дословно и ввести в консоль винды эту команду, чтобы проверить.
112 2270027
>>66995 (OP)
Привет программач.
Есть одна простенькая бд
И есть модуль, который сохраняет в базу данных строки по столбцам и извлекает их по запросу. Я это реализовал с помощью одних функций (создать базу если её нет, проверить наличие записи в бд, создать запись, обновить запись, удалить запись. Ключ - уникальный id).
И задался вопросом, может это сделать классом? Но так как я туповатый самоучка и с классами пока не работал (только теоретически и на детских примерах), не очень понятно с чего начать. inb4: идти в школу/нахуй/в университет/в гугл
113 2270040
>>67914

>То есть выполняя простую операцию в треде тебе не нужно прерывать его каждый раз когда авэйт вызвается чтобы переключиться на другую таску


Чаво блять? Если await стоит то он не спроста нахуй, нужно переключить контекст и вытащить результат определенной Future, потому что функция иначе не сможет дальше работать. Если тебе нужно что-то выполнить в бекгрануде то делается сразу несколько "хаков":

asyncio.create_task
loop.call_soon
Future.add_done_callback
asyncio.gather (для одновременного исполнения множества запросов)
114 2270084
>>68216

>Это будут два отдельным метода, типа сделать запрос и записать в базу


Скорее всего это будет проходить в одном методе, который однако будет дергать 2 других - какие-нибудь ModelService.make_request и ModelRepositary.save_model
115 2270090
>>68302

>Асинхронность в беке нахуй не упёрлась


Таблетки, дед
116 2270116
>>68496

>Особеность асинхронщины, что этот запрос обрабатывался бы те же 200мс, но при этом несколько раз в одну мс менял бы контекст


Чел... асинхронка вообще не так работает. Контекст меняется только в момент когда асинхронная таска исполнилась и ивент луп взял ее результат

>го


>для асинхронщины


Чел ты...
https://medium.com/nuances-of-programming/конкурентность-и-параллелизм-в-golang-go-процедуры-82bae0f92e81
117 2270127
>>69419
Model.objects.bulk_update
118 2270601
Можно как-то в модуле requests выставить ограничение по количеству запросов на конкретный ресурс? Для всего сервера. Есть сторонняя апи, которая ограничена 7 запросами в секунду блядь.
Типа, если в данный момент идут 10 запросов, то выполняются 6, а остальные ждут пока освободится место.
119 2270692
>>70601
Покажи код, ты через мультипроцессинг/мультитрединг сделал?
image.png741 Кб, 1280x720
120 2270696
>>70601
Семафоры
Очевидно же
121 2270729
>>70692
Там говнокод обыкновенный. В некоторых тасках последовательные, в некоторых через futures по максимум 5 одновременных запросов за раз, если надо сделать больше. Асинк не использую, ибо джанго, да и не умею пока. Переписывать на фастапи уже поздно.
Проблема в том, что может получится так, что у меня будут активны много запросов на один и тот же домен. Ладно, если он просто возвращал ответ о превышени лимита, так он ещё в бан отправит нахуй, если я нарушаю частоту несколько раз.

Как это может быть сделано. Проверить количество текущих активных запросов на конкретный домен, и если он выше определённого числа, то ждать, скажем, 100мс перед следующей проверкой.

Просто я не знаю как это сделать
122 2270741
Как вообще хранить пользователей в джанге, которые вошли через oauth/openid? Хотелось бы конечно использовать стандартную модельку для юзера, но вот чё в эту модельку вместо пароля пихать и как аутентифицировать юзера хз.
123 2270775
>>70741
В джанге встроенный же это во всё. Указываешь базу и всё
124 2270787
>>70729
Если тебе лень разбираться, могу предложить в качестве костыля развернуть рядом с твоей аппкой прокси, которое будет обрубать тебе количество запросов.
125 2270817
>>70787
Это надо делать на домен. Не на все запросы. И таск должен просто подождать, а не кидать ошибку
126 2270819
>>70775
Так для стандартной аутентификации нужен пароль же, а уменя его по факту нет. Это получается мне свой бек для аутентификации писать?
127 2270826
Сап питонюги.
Я ньюфаг в этом деле, буквально вот-вот начал интересоваться.
Python 3.9 на команду pip instal sha256 очень ругается, не могу понять почему.
В гугле ответ на проблему не смог найти.
Буду рад, если кто пояснит почему такое происходит и как фиксить.
128 2270828
>>70826
install само собой быстрофикс
129 2270849
>>70826
Успокой его и он не будет ругаться
Мы как должны понять что у тебя не так? Скидывай трейсбек
130 2270851
>>70817
В общем, ratelimits позволяет такое провернуть. Осталось понять, как это привязать к домену, а не только к функции
131 2271107
>>70851
Штуковина ratelimits подошла хорошо. Тред можно закрывать
image.png40 Кб, 951x272
132 2271137
Привет питонисты. У меня вопрос, как у вас многопоточность реализована? Каждый экекутор в этом случае это отдельный OS process, порождённый родительским процессом (python процессом, который исполняет main скрипт?)
133 2271139
Всмысле та же хуйня что и в джаве. Каждый поток это процесс на уровне операционной системы. И если нужно мчаться кабанчиком, то переключение контекста между потоками ОС становится слишком длинным и вот из-за этой причины нужна всякая асинхронная поеботина? Типа планировщик потоков переносим с уровня ОС на уровень приложения?
Я просто научную работу пишу на эту тему в Берлинском технологическом университете. Никак не могу разобраться.
134 2271195
>>70116
Контекст переключается на каждом авейте. Авейт это такой гоуту на глобальную функцию ивентлупа, которая сама решит какую тасочку потом продолжить. А внутри асинхроной либы может быть дохуя вложеных асинк функций с авейтами. и статью твою читать не буду. она на русском. я не говноет таким обмазываться
135 2271196
>>70040
то что авейт не спроста не значит что он не несёт оверхед. внутри одной вункции стоит несколько авейтов. потом эту функцию с авейтом вызывают. и так несколько раз внутри всей асинхроной библиотеки. в итоге дохуя цпу времени тратится просто на переключение между контекстом вместо того чтобы тратить его на цпу баунд таски. в итоге с асинхронмы кодом ты не можешь на 100 процентов заюзать цпу полезными тасками. ты заюзаешь его на 90 процентов полезными и на 100 переключением контекста. а в тредах это можно сделать и там скорость выполнения простых тасок выше.
136 2271201
>>71139
Нет же. процесы вместо тредов обычно нужны из-за гила. а асинхроность ускоряет ио баунд таски. типа если тебе надо 100 раз по урлам обратиться открыть проще это в одном треде асинхроном сделать, чем для каждого урла создавать тред и тратить ресурсы ядра на эти операции
137 2271318
>>71137
У тебя явно написано тредпул
138 2271326
>>71196
Переключение тредов тоже требует ресурсов, скорее больше, чем переключение задач в asyncio. Особенно если ты ещё какие-нибудь uvloop добавишь.

Альтернатива асинкио это несколько работающих ПРОЦЕССОВ, и внешний балансировщик, который раздаёт задания процессам. В принципе в большинстве случаев ты запускаешь много процессов, которые обслуживают всю нагрузку. Вместо того, чтобы держать event loop, ты можешь держать достаточно много процессов, с запасом, каждый процесс просто последовательно запросы обслуживает.

Синхронные фреймворки только так и запускают, тебе про треды ничего знать и не надо в этом случае.
139 2271340
>>71326

>Переключение тредов тоже требует ресурсов, скорее больше, чем переключение задач в asyncio


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

И процессы это не альтернатива. Это абсолютно другой вариант распаралеливания. Он не заменит асинкие
140 2271485
Почему celery продолжает засовывать все таски в default queue, несмотря на то что я запускаю воркеров с разными очередяни, указал в конфиге какая очередь для какой таски используется и явно указываю очередь при передаче аргументов через apply_assync? В конфиге указал очередь для beat, и всё равно он юзает очередь по умолчанию
141 2271530
>>71485
Проблема точно в beat. Обнови его конвиг и рестартни. Ещё можешь ивенты включить и посмотреть кто куда что отправляет
36313900.jpg80 Кб, 581x604
142 2271538
Перекатился в бидон и начал забывать перл.
Жалка.
143 2271553
>>71530
Самое интересное, что с остальных очередей таски суются в default queue, несмотря на явное указание.
144 2271700
Как aiopg использовать правильно? В примерах ахуеть какая громадная портянка. Да и создается пул чтоб SELECT 1 сделать.
145 2271893
>>71553
Всё решилось указанием очереди в app.task(queue=...) Остальное просто игнорировалось
146 2272029
Ряяя. Поздравьте! Нашел первую первую работку на Питоне!!!

Выбираю стек технологий в новый проект. Подскажите ORM, который бы при UPDATE записи базы данных, если заблокированна, сам дожидался ее разблокирования и выполнял апдейт (прозрачно для программиста).
147 2272119
>>71196

>в итоге дохуя цпу времени тратится просто на переключение между контекстом


1 мкс?
Шизофреник, ты че несешь? Ты попробуй произвольную синхронную прогу переписать на асинк так чтобы он был исключительно оверхедом, т.к. без IO-операций - по приколу вызывай каждую функцию через await и посмотри на оверхед, он блять не превысит 3%
148 2272144
>>72029

>Первую работу


>Выбираю стек


Пизда проекту. Не такого орм, который бы дедлок аккуратно доидался. У тебя к хуям сервис умрет
149 2272145
>>71195

>она на русском я не говноет таким обмазываться


Прозападный пердикс косит под зумерка, спешите видеть
150 2272282
Как согласовывать обновы кода с изменениями базы данных?

Вот есть у меня джанго-приложуха, я в ней меняю схемы БД на удаленном тест-серваке через миграции, затем через какое-то время на этот сервер я заливаю другой код, из более ранее ветки, и там же сцуко схемы БД будут другие из-за чего могут вылезать занятные ошибки на NOT-NULL CONSTRAINT и прочее. Как с таким справляться?
151 2272359
>>72282
На серве? А локально че делать если я работаю на ветке провел N миграций а потом возвращаюсь к более старой ветке и миграции там не залиты. Как разрабатывать-то?
152 2272366
>>72282
Проиграл. У тебя есть мастер ветка. В которой хранятся финальные или околофинальные изменения. Делаешь дроп таблицы? Ок. Старая ветка юзает поле, которое дропнуто? Не юзай его, переделывай таску. Если просто конфликт миграций - вливаешь масте в свою ветку, обновляешь миграцию и делаешь её последней.
153 2272370
>>72366

>вливаешь масте в свою ветку


Шо? Рибейз что ле?
154 2272379
>>72366
Тут ситуация такая: никакие миграции не конфликтуют, однако при попытке добавить запись в таблицу вылезает NOT NULL CONSTRAINT VIOLATION потому что в новых миграциях была добавлена новая колонка, которая обазательна (а default у нее не проставлен). Очевидно что в старом коде добавление происходит без учета этой колонки. Как его тестить-то блэт?
155 2272382
>>72119

>1 мкс?


Тут есть нюанс, если у тебя есть операции (например, парсинг/генерация жсона, которой необходимо 20 мс) для выполнения в 2 из 10 тредов, а в остальных ожидание базы/апи/етц, то их скорость снизится в 5 раз, так как каждому треду выделяется равное количество процессорного времени и в рамках 100 мс на треды с полезной нагрузкой будет выделено только 2 * 10 мс. В то время, кооперативная многозадачность позволит решить эту проблему, так как в этом случае трата гпу на неактивные таски не производится.
16325880837930.png56 Кб, 800x800
156 2272409
С сегодняшнего дня примыкаю к вам, питонистам! Заступил на курс по пайтона, там 4 вебинара, после каждого дают задания. В конце среди тех кто выполнил все Д/З, будут отбирать на оплачиваемую стажировку.

Пока что ни разу не изучал пайтон, впервые буду трогать его. Начну с мурзилки, всё как полагается - метанит.

Я верю в себя, пацантре! Я стану лучшим на этой стажировке!

мимо 1С-Битрикс middle
157 2272411
>>72409
Лучше бы книгу почитал, вебинар.
158 2272413
>>72411
Так это чтобы попасть на стажировку, офк с вебинара почти ноль полезной инфы, плюс у них плеер плохой, когда перетаскиваешь ползунок, то не показывает какая минута видео. А на ютуб отказываются заливать, лол.

Я же сказал

>мурзилка - метанит



Потом мб книги с шапки почитаю.
159 2272434
>>66995 (OP)
Привет, Питонисты. Реквестирую объяснения на человеческом работы Channels для Джанги 3, почему какие-то вечные sync to Async , че вообще, можно как-то привычные вещи с эвент лупом написать? Как вообще мне asyncio использовать в этой либе? Мне кажется, я не понимаю ее идею именно, для каких целей она создана
160 2272444
>>72434
Типа почему я не могу перенаправлять роутом запросы TCP/UDP на то место, где я скажем поднял на другом порте что-нибудь асинхронное в своей как бы среде, с asyncio, aiohttp и шлюхами

Тут и постепенное внедрение микросервисов, тут и гибкость, тут и как бы меньше кода, удобнее, почему нет?

Разве что на фронте могут быть проблемы какие-то, но думаю это решаемо

В ту сторону вообще воюю, господа ?
161 2272448
>>72379
Ну добавь какое-то значение в старый код, если оно обязательно и нет дефолта. Очевидно же.
162 2272523
Челики, подскажите.
В мейне создаются сервисы асинхронные, в зависимости от параметров переданных и запускается
from aiomisc import entrypoint
with entrypoint([list, of, entrypionts] as loop:
____loop.run_forever()
Так же в мейне я хочу инициализировать пул коннектов для бд. Пул создать еще до создания сервисов, бд должна отдать данные для сервисов и из пула брать коннект до остановки сервисов. Я написал получение коннектов, но нужен работающий цикл событий. Как это сделать? Еще один евент луп создавать что ли? Но так, вроде, делать неправильно
163 2272573
>>72523
Я запутался если честно, попробуй добавить инициализации конекторов при создании лупа или же просто как отдельную короутину запускай сначала, может быть gather-ом , я бы 2 луп не создавал, тебе охота с 2 ебаться ?
164 2272616
Как работают платежные системы встроенные в сайт?
Видел ссылки на всякие python-sdk но суть нигде так и не пояснена: КАК работает платежкп? Куда там и как реквесты передаются?
166 2272635
Прикиньте? А у циана таки прод на торнадо написан!
167 2272647
>>72635
У нас сервис авторизации тоже на торнадо написан.
168 2272653
>>72635
У них изначально вообще был фласк, потом они патчили его через гевент.
169 2272662
https://python-patterns.guide/
Добавьте в шапку.
170 2272668
https://hh.ru/vacancy/51494568

>Python developer trainee


>Практический опыт с Python от полугода



Шутки кончились!
171 2272685
>>72573
Короче вот пример
from aiomisc improt entrypoint
...
if __name__ == '__main__':
__# Вот тут как сделать асинхронный вызов функции в том же цикле событий, что и внизу луп?
____service = Service()
____with entrypoint(service) as loop:
________looз.run_forever()
172 2272724
>>72668
Ну дак это немецкая компания, плюс 40к платят, так что справедливо. Тем более это необязательно коммерческий опыт, можно и пет-проекты.
173 2272731
>>72685
Побробуй asyncio.Run in executor

Тебе зачем вызывать инициализацию базы в эвент лупе ? Почему не сделать так
1. Запуск инициализации пул коннектов
2. Далее в эвент лупе создаешь сервисы или че там

че там aiomisc я не знаю в душе, я угарел по стандартной либе
174 2272733
>>72731

>Тебе зачем вызывать инициализацию базы в эвент лупе ?


Конфиги там для сервисов лежат, таймеры, предельные значения, таймауты и т.д.
175 2272743
>>72733
Ну вызови тоже самое в эвент лупе через asyncio , по сути у тебя что вызывается то ? Асинхронные функции , короутины, вот, он их и вызовет в отдельном как бы исполнителе, это не то чтоб отдельный эвент луп, если представить завод, то executor это что-то типа подрядчик с соседнего цеха , собственно , более того, у тебя 1 эвент луп будет, если ты решишь получить экземпляр лупа, то он будет как у тебя изначально в твоем коде после комментария, то бишь даже так, твои инциаилизации не будут крутится в этом лупе, но будут выполнены до начала лупа, что тебе и нужно, нет?
Снимок экрана 2022-01-21 в 19.32.48.png94 Кб, 582x328
176 2272747
>>72743
Бля, я в начале хотел сказать в executor , более того можешь даже в thread pool executor

>Ну вызови тоже самое в эвент лупе через asyncio



я об этой строке
177 2272766
посмотрел "джанго за час" на ютабе, где можно мои 300кк забрать?
178 2272771
>>72766
У Гоши Дударя спроси, или кто там еще есть из таких, во, Аудио Хо или АудиХо, ну как-то так, что-то с Хо
179 2272796
>>72766
Ты сначала свое что-то напиши или на опенсорсе что-то зделай, какой-нить плагин допили/обнови, который авторы забросили. Вот это будет считаться. А твоё видео это кал.
180 2272803
>>72796
Это очень большая ошибка посылать новичка сразу в попенсорс. Туда как раз таки пишут люди с большим опытом и пониманием того что и зачем они делают. Даже просто так обновить либы нельзя, потому что это требует проверки на совместимость.
181 2272806
>>72803
Ну ладно тогда просто зделай пет-проект, вкатись за еду в рандом-город, где мало конкуренции и учись у старших коллег писать код, а потом в опенсорс. Хотя уже не понадобится.
182 2273012
>>66995 (OP)
Аноны, что представляют собой переменные с точки зрения интерпретатора? Где они хранятся?
У Лутца (Изучаем Python, т.1, 209 стр.):

>Переменные — это записи в системной таблице, в которых предусмотрены мес­та для связей с объектами.


Это мне ни о чем не говорит - пытался нагуглить, что за системные таблицы, ничего конкретного нет.
Ответ, что переменная - это указатель на значение в памяти, не подходит. Я понимаю, что она делает - вопрос в том, что она собой представляет.
184 2273066
Анончики, может кто объяснить, как работает такой компрехеншн, откуда у вызова функции поиска в глубину (dfs) есть информация о node?
Почему он сначала вычисляет вложенный цикл?
graph_cycles = [[node]+path for node in graph for path in dfs(graph, node, node)]
185 2273070
>>73066
Компрехеншен разворачивается слева направо.
wolfreview.jpg121 Кб, 820x430
186 2273107
Что мне гуглить что бы узнать про модули и как работает импорт в питоне. Как работает в питоне аналог композера в пхп?
187 2273119
>>73021
❤️
188 2273157
>>73107
Что такое композер?
189 2273237
>>73157
менеджер пакетов
190 2273492
Как сделать чтоб джанга была быстрее
191 2273537
Суть такова. Один запрос это проверка наличия какой-то записи на другом апи, если её нет, создать, потом привязать полученный id паррочкой других (последовательных) запросов, потом проверить наличие ещё одной херни и создать если нет и заключительный один или два запроса.
Вот вы тут значит дрочите на скорость асинхроннщины. Как быть с этим, когда последующий запрос напрямую зависит от предыдущего?
192 2273581
>>73537
Если у тебя один запрос в секунду и каждый из них выполняется раньше, чем поступает следующий то никаких преимуществ.
А вот теперь представь, что у тебя два (три, четыре, сто, etc) запроса одновременно. Во время ожидания первого запроса уже можно начинать второй, так как контекст в это время свободен.
193 2273610
>>73581
Я так и делаю. Выделяю относительно независимые участки кода и сую их в executor. Но таких мест очень мало. Просто обидно что один запрос оьрабатывается так долго, примерно секунды две.
Приходится делать очередь с одним воркером, скорость пиздец, но по другому нельзя, иначе у меня появятся два одновременных запроса которые создадут две записи, чего быть недолжно.

Уже мысль появилась, может копить это говно по 10 штук и одновременно их обрабатывать. Апи позволяет делать пакетные запросы, но это в итоге в такой говнокод превратится, это пиздец
194 2273625
>>73610

>примерно секунды две


У тебя там процессинг какой-то или простое ожидание?

>Приходится делать очередь с одним воркером, скорость пиздец, но по другому нельзя, иначе у меня появятся два одновременных запроса которые создадут две записи, чего быть недолжно.


То есть тебе нельзя делать одновременные запросы, но при этом ты решил делать все через асинхронность? А ты знаешь зачем она вообще нужна? Тебе даже с мультитредами/процессами пришлось бы ждать.
Однако, ты говорил про то, что ты проверяешь какую-то запись. Если это происходит по айди приходящему извне, то ты можешь сделать лочку через set().
195 2273676
>>73625
Не, я не это имел ввиду. К примеру, мне приходит запрос, содержащий номер телефона и сообщение. Я делаю запрос, чтоб проверить наличие контакта и получить его id, если контакта нет, делаю следующий запрос на создание контакта, откуда получаю id, потом использую его на создание чата и получения id чата (храню в базе), потом проверки наличия связи этого чата с другой сущностью и создание если его нет и только потом отправка сообщения по id чата.
Вся эта процедура это один запрос на мой сервер. К примеру, мне могут прийти одновременно два таких запроса на разные параллельные инстансы сервера. Он вполне может создать два одинаковых контакта, если его нет. Как решаются такие проблемы? Очередь с одним работником? Я так и делаю сейчас, но это пиздец как медленно
196 2273733
>>73676
Первый вариант
Делаешь внешнее хранилище, например redis, проверяешь отсутствие номера там, куда кидаешь его внутрь и после окончания удаляешь оттуда, соответственно, если номер там, то отбрасываешь реквест, желательно, что бы клиент был синхронный, что бы во время ожидания не сделать доп запрос.

Второй вариант
Делаешь дополнительно сервис-балансировщик, который принимает все запросы и каждому инстансу присваиваешь номер. Подбираешь ключ партицирования (в твоем случае это номер телефона) и функцию партицирования так, что бы запросы распределялись равномерно по сервисам. (можно просто mod). Каждый запрос кидаешь по нужному инстансу согласно результату функции. В самом сервисе уже можешь сделать внутреннее хранилище, например set/dict, которое проверяет обрабатывается ли этот ключ в данном сервисе в данный момент и откидывает его (или кладет в какую-нибудь очередь, что бы потом запроцессить, после окончания предыдущего запроса).

Первый вариант гораздо легче реализуется, второй идеалогически правильнее.
197 2273772
>>73733
Я еще чуть подумал, в случае редиса можешь и асинхронный клиент юзать. Сам редис однопоточный и даже если ты сделаешь два запроса одновременно один гарантированно отвалится.
198 2273775
>>73733
Выглядит неплохо, вероятность появления дублированных запросов снижается, но всё же остаётся.
Можно попробовать в мемкеш сувать какой-нибудь идентификатор запроса и удалять его при завершении. Если он присутствует - приостанавливать запрос, либо отправлять его содержимое в мемкеш, где предыдущий запрос в конце будет проверять наличие другой. Но в первом случае забьются инстансы, а во втором память.
199 2273779
Блядь, вечно приходится выбирать меж двух стульев. Как же заебало
200 2273800
>>73775

>но всё же остаётся


Откуда она у тебя остается? Хранилище последовательно обрабатывает запросы на удаление/вставку.
201 2273977
Как использовать установленые пакеты в virtualenv. Установил расширение flask_bootstrap и хрен его знает как его импортировать
Снимок экрана 2022-01-23 в 02.41.37.png115 Кб, 1526x740
202 2274173
>>73977
Чел, видимо программирование это не твое.
203 2274214
Можно в джанге uvicorn указать для отдельных роутов только одного активного воркера?
204 2274216
Какой фреймворк лучше всего подходит для чистого бекенда?
205 2274217
>>74216
Какого чистого?
206 2274219
>>74217
Без вебстраниц, статикфайлов, и тп
207 2274224
>>74173
Кидает ошибку при импорте.нахуй иди
208 2274229
>>73977
>>74224
Ты сам венв то включил, дурень?
209 2274250
>>74219
fastapi
210 2274265
>>74229
Включил, не тот питон в баше работал А ты токсик ))
211 2274277
Надо загнать один пакет в приватный гитлаб, но чтобы его можно было поставить через pip. Кто делал?
213 2274401
>>66995 (OP)
Антуаны, возможно вопрос не по теме, но не знаю где еще спросить.
Почему -4//3 дает -2?
Почему не -1?
Спасибо.
214 2274420
>>74401
В сети нашел такое объяснение.

>Разделить целое число a на целое число b!=0 с остатком — это значит


>найти такие два целых q и r, которые удовлетворяют следующим условиям:


>1) a = b q + r;


>2) 0 <= r < |b|.


Но все равно не сходится. Предположим, что -4//3 будет -2
(-2)
3+1 получается -5, а не -4
215 2274481
>>74401
Если вкратце, // округляет вниз, ближайшее целое, меньшее -1.(3) - это -2
216 2274756
>>67346
Если ты про аннотацию типов и тип возвращаемого значения -- я использую, мне очень нравится. У меня тоже вопрос: как пользоваться директивой todo? Есть гайды на эту тему, примеры? Я бы хотел отмечать в коде планы на будущее
217 2274807
>>74756
Что тебе конкретно непонятно в использовании todo?
Просто без задней мысли пишешь
# todo: допилить хуйнянейм
И всё, дальше тебе IDE напомнит, если что.
Типа, туду не надо использовать в виде "планов на будущее", как ты сказал, для этого должен быть адекватный бэклог. Это просто записка о том, что код можно в этом месте улучшить/отрефакторить, но сейчас это делать некогда.
218 2274852
>>73492
А какие у тебя вопросы по скорости к сейчас? Покажи пару тестов, замаж офк что не нужно видеть или вырежь, джанга так -то по скорости удовлетворяет большинству задач малого бизнеса
Снимок экрана от 2021-07-21 16-54-31.png193 Кб, 629x267
219 2275027
Пытаюсь добавить фильтр в jinja2, все делаю по инструкции, если делаю все прямо скрипте так
def debug(text):
print("i debug filter")
return ''

environment.filters['debug'] = debug
то работает на ура. Но если пытаюсь применить этот фильтр где то на html page , то жалуется что такого фильтра нет и падает приложение.
Как правильно добавлять фильтр правильно, че то не могу нагуглить как оно глобально работает
220 2275110
Сап аноны не могу сделать одну фигню
Я пытаюсь написать редактер с tkinter
В общем там несколько окон
Основное с холостом
И окно с инструментами делаю toplevel
Есть в итоге два файла main.py и tools.py с этим окошком.
Пытаюсь написать функцию которая ресует на canvas из main при нажатии на кнопку в побочном окне. Всё это в tools.
Только вопрос как мне получить доступ к canva из main в tools
Я хотел при создании в main передавать типа
c=Canvas()
from tools import *
tool = tools(c)
Но ошибку выдаёт что делать?
IMG20220124001843.jpg50 Кб, 720x705
221 2275124
>>75110
Серее уже нашел
222 2275225
Есть одна рулетка...
Написал функцию, вложил в цикл. На первой итерации работает нормально, после - не обновляет количество очков. В чем может быть проблема?
https://pastebin.com/NeyyThfB
223 2275301
>>75225
Параметр функции score перекрывает глобальный.
224 2275354
>>75225
Что-то в голосину с наименования переменных. Ты в курсе, что лучше сразу приучать себя к нормальному неймингу?
225 2275359
>>75354
ochko = input('ochko')
226 2275405
>>75354
Да я срал в этот нормальный нейминг,скучно с ним.
>>75301
Как такое возможно? Это ведь не переменная даже.
227 2275410
>>75405

> Это ведь не переменная даже


Лол, а что же это?
228 2275434
>>75405
Тогда и на реальных проектах тебе будет скучно, завязывай, другалек.

Глобальная переменная - это тебе намек на то, что надо почитать про области видимости переменных.
229 2275436
Вот пишу я у себя на компе программу на питоне, и мне нужно, чтобы, с одной стороны, у меня на компе были установлены нужный питон и пакеты с зависимостями, с другой - чтобы всё это не было установлено глобально, т. к. для другой программы версия питона и пакеты могут быть другими, а с третьей - чтобы можно было этот набор (питон + пакеты с зависимостями) точно воспроизвести на любом другом компе (на сервере, например). Какие тулзы для всего этого принято использовать?
230 2275438
>>75436
virtualenv
231 2275439
>>75410
>>75434
Вы лучше вот что мне объясните, если это переменная и она локальная, создаётся для каждого вызова функции, как она может влиять на что-либо вне самой функции? Может, там как-то можно удалить неиспользуемые переменные?
232 2275441
>>75436
pyenv, venv, docker
233 2275451
>>75439
Так она и не влияет, ты пробуешь менять глобальную переменную в функции, но она недоступна, потому что перекрыта локальной. Да и это бы не получилось, потому что надо было бы пробрасывать ее в скоуп через global. В любом случае, это хуевый подход. Лучше чтобы функция возвращала на хуевертила с глобальными переменным, а возвращала результат, который уже можно использовать вменяемо.
234 2275556
235 2275566
Есть хендлер который навесили на все ошибки в Celery через декоратор вот так:

@task_failure.connect
def my_handler(args, *kwargs):
----pass

Проблема в том что он глобально нах не нужен, его стоит вешать только на определенные типы ошибок. Как это поменять?
236 2275586
Каково влияние на производительность, если я импорты делаю внутри вызываемых функций а не вверху модуля? (из-за предотвращения циклических импортов)
Screenshot 2022-01-24 at 15.18.37.png27 Кб, 940x168
237 2275605
Помогите адаптировать кусок питона на ноду. Оба метода из либы Cryptodome. Продублирую и сюда, помимо js треда, на случай если среди питонистов есть разбирающиеся в криптографии и знающие ноду.

Cryptodome.Hash -> SHA1
Cryptodome.Signature -> pss


Перепробовал множество разных вариантов с модулем crypto (да и со сторонними) - не получается.. Есть сервер, на который эта подпись отправляется, так и узнаю о корректности данных. Через питон запрос успешно проходит, а на ноде ошибка.
238 2275635
Как в psycopg2 кешировать результат селекта?
Я сделал нотификацию, когда данные изменились и время взять свежие, но как их закешировать?
239 2275637
>>75635
Анус себе закешируй
240 2275684
Хочу создать чат-бота для сайта. Для начала хотел начать с простого - что-то вроде обратной связи/ящика пожеланий: чтобы пользователь мог выбрать куда отправлять (например, номер отдела и т.п.) и сообщение. Данные уходили бы в бд Postgre. С чего начать в данной задаче?
241 2275704
>>75684
С чего там можно начинать? Форма обычная, делов на пять сек.
242 2275768
>>75704
А примеры есть? В питон вебе почти ноль
243 2275779
>>75768
Бля, ну читни какую-то начальную книгу по фласку или джанго, или что ты там хочешь, или посмотри видяшку на ютубе от зумера зумеркова.
Это самое начало начал.
244 2275888
Раз тут про асинхронность пишут, где можно почтитать? Вот прям с нуля и не документацию. Там уже рачитано, что шарю в этом. Циклы событий как делаются, как вклинить в существующий цикл, чтоб в синхронном вызвать асинхронный код и т.д.
245 2276082
Я вкочуся вот увитити...и не просто клепать апи на фастапи, а в датасаенс!!! я понимаю тчо такое лагарифм и видео в ютубе по байесому митаду пастматрел изи 300к\наносек буду...вот увитити...

Кроме шуток, заебала эта биполярка, никак не начну даже пытаться найти работу. С утра проснусь думаю збс, много чего уже знаю, проходит три часа и уже ужасаешься, что невозможно найти РАБоту, просматривая списки требованийпоплакал
247 2276108
>>76106
Смотрел у него про ООП - неблохо, приятный чувак.
Надо будет глянуть.
248 2276499
Планирую начать изучать Питон, а потом перейти на PyGame и попробовать на нём запилить какую-нибудь простенькую 2д игру со знакомым художником.
Какие подводные моего плана?
249 2276530
>>76499
Если не планируешь зарабатывать деньги на этом,то никаких.
250 2276533
У меня есть функция, которая в бесконечном цикле исполняется.
При определенном условии она должна пинговать классам разным, что состояние изменилось и надо получить новые данные.
Как это сделать? Думал через коллбек сделать, но тогда придется список классов вносить, какие методы дергать.
Через сигналы вроде можно, но тогда надо метод определить, который бы присваивался классу, да и хз как его сделать. статическим нельзя, ведь переменные класса надо менять, а класс метод - опять же надо список классов иметь.
Какую-то корутину определять не знаю как, да и выглядит так себе. Слушатель должен быть один, а если она будет, то каждый будет дергать бд и куча лишних коннектов к бд будет
251 2276571
>>76530
На игре не планирую.
В будущем планирую, но тема с питоном это просто как разминка для мозга.
Потом планирую вкатываться в c# уже по серьёзному.
252 2276594
Если я делаю
class A:
____def __init__(self, some_obj)
________self.method_a = some_obj.method_a
Могу ли я как-то сделать, чтоб при вызова some_obj.method_a()
в классе A помимо method_a выполнялись другие действия?
253 2276598
>>76594
Что за наркомания. Почему не передать в some_obj объект класса А и уже из obj.method_a вызывать действия с классом А
изображение.png121 Кб, 815x553
254 2277032
Дайте гайдов книг или примеров как делать приложения на Flask. Скачал книгу по фласку, но как то она мне не очень. Прыгает как то сильно по темам и только расширения установаливает миллион ну и конечно я долбоеб не умею гиглить и по книгам учиться зашквар
255 2277148
>>76106
Немного не то, что я имел ввиду. Мне бы что-нибудь про подробный разбор asyncio. Там ебнешься сколько методов запуска, с новыми потоками, с тасками. Вот тут я обосрался, когда пытался в существующем цикле событий вставить вызов маленькой функции
256 2277333
Джангочушки, почему вы такие зачуханные? Вам не стыдно нахуй? Если встречаем джангиста, который идет к нам собеситься, начинаем его закидывать вопросами по фастапи, он поскуливает и пытается оправдаться что не очень хорошо с ним знаком, но мы подъебываем его на тему "это стандарт нахуй. это знать надо!". Под конец можно ебануть и несколько вопросов по Джанге, чтоб потроллить канешн, например про сигналы джанги спросить или про конкурентность, когда он таки высирается, интересуемся, каково постоянно юзать такие вот костыли, после такого он обычно морально убит нахуй
257 2277336
>>77148

>когда пытался в существующем цикле событий вставить вызов маленькой функции


Че?
258 2277342
>>77333
Вброс конечно, но по работе основной бек был изначально на джанге, все новое пилю на фастапи. Перегруженные тонной ебанины конвееры типа джанги и ему подобных аналогов на других языках считаю устаревшим подходом. Всегда можно ебануть элегантную и более эффективную сборку на микрофреймах и чувствовать себя хозяином в своем коде.
259 2277351
>>77032
У Flask хорошая документация, кроме нее ничего не нужно. Я делал минимальное приложение, как здесь сказано
https://flask.palletsprojects.com/en/2.0.x/quickstart/#a-minimal-application
а потом по мере добавления функциональности изучал соотв. разделы.
260 2277354
>>77333
Токсичная у вас атмосфера.
261 2277450
>>76571

>планирую


Планирую планирую

Нахуй нам это знать, другалек ? Планами знаешь кого насмешишь? Делай лучше. 0 токсичности
>>76533
Архитектурно сложно и муторно, попробуй изменить архитектуру

>>77333
двачую
>>77342
двачую
262 2277461
>>76533

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


Pub-Sub
263 2277770
>>77333
Нахуй пошел.
Без имени.png35 Кб, 652x660
264 2278024
Поставил я значит anaconda.navigator, создал там среду, скачал туда kivy, запускаю vsconde среда подключилась, pip freeze говорит что kivy установился но в самом редакторе kivy не видит в чём причина?
265 2278025
Сап. Конечно, этот вопрос можно было бы задать в основном треде, но я думаю там бы все равно пнули сюда. Вообщем, походил я на разные курсы, а-ля "Программирование для начинающих" да, я еще шкила, прошел курс на питонтьюторе и... Все. Я не знаю куда двигатся дальше. Я могу решить несложную олимпиадную задачу, но не более.
Как мне, допустим, написать калькулятор? Отдельным окошком, с кнопочками. Ну, на сишарпе я наверно сделать смогу, там конструктор винформс, как делфи. На андройде также.
Но как написать графическое приложение на питоне, или там базу данных например? Где все книжки на эту тему? Каюсь, ничего не искал особо, но все книги или гайды, которые я видел, это либо "для начинающих", либо что-то для уже программистов, что выше моего уровня.

Покажите путь ньюфагу, аноны
266 2278027
>>78025
pyside(qt), kivy и т.д. посмотри это на счёт форм
267 2278031
>>78024
Он в венве, а ты поставил для системного бидона небось.
image.png11 Кб, 609x212
268 2278032
>>78031
Разве не так?
269 2278037
>>78031
Оказалось в vscode нужно было выбрать интерпретатор
270 2278204
>>77450

>Планирую планирую


>


>Нахуй нам это знать, другалек ? Планами знаешь кого насмешишь? Делай лучше. 0 токсичности


Вообще, довольно токсично. Я уже начал изучать питон.
271 2278212
>>67453
Чем старше инструмент, тем больше в сети по нему статей. Если видишь много статей для какого-то инструмента, есть повод задуматься что он устарел. Чаще смотри на даты статей. Юзай fastapi и pydantic

мимокрокодил 250кк в секунду
272 2278334
Есть такая штука:
https://docs.python.org/3/library/asyncio-stream.html
Задача:
Несколько клиентов1 подключается на 1001 порт, несколько клиентов2 на 2002 порт одного сервера. Требуется обработать и передать клиентам2 всё что отправит на сервер каждый из клиентов1.
Не пойму как православно реализовать такое. Держать глобально массив Writer'ов? Для каждого клиента2 создавать очередь? Или вообще использовать другую либу?
273 2278335
То есть как передать данные из одного сервера в другой, чтобы каждому клиенту досталось?
274 2278491
Сап. Нужно в определенное фиксированное время исполнять какие-то действия. Допустим, есть список чатиков, в каждый чатик нужно закинуть что-то свое. Какой инструмент мне бля этого нужен? Message broker?
275 2278518
>>78491
Молоток
276 2278553
>>78491
Тебе крона достаточно будет
277 2278555
>>78334

>Для каждого клиента2 создавать очередь?


Да, так любая вебсокетная либа устроена
278 2278596
>>78555
А тот факт, что всем по сути отправляется одно и то же никак не упрощает задачу? Может что-то на протоколах наколдовать можно?
Трудно себе представляю как сервер1 будет знать сколько клиентов у сервера2. Получается, нужна главная очередь и очереди на каждое соединение? Не много ли очередей для такой простой задачи? Без них не обойтись?
279 2278598
Всмысле не встроены ли там очереди уже в эту либу под капотом?
280 2278689
Посоны, нужна ваша помощь (написать скрипт для голосования чтоб защитить честь двача и спасти жизнь Абу) подробнее тут

https://2ch.hk/b/res/262122227.html (М)
281 2278709
>>78596
А у тебя клиенты как подключаются то? По какому протоколу? Тебе в любом случае нужно иметь пул соединений
282 2278786
>>78709
asyncio.start_server() разве сам его не создаёт?
Может есть ссылка что почитать где нормальным русским языком объясняется про все эти потокобезопасности, сокеты, вебсокеты, пулы, протоколы, стримы и т.д. А то сами исходники понятней чем английские маны по ним. Везде 100500 способов сделать сервер на asyncio, но к какому способу в каком случае и зачем прибегают нигде не сказано. Везде "можно ещё вот так и вот так изъебнуться, смотри как здорово!"
283 2278944
Объясните кое-что по поводу замеров времени, аноны. Замеряю двумя разными способами простой цикл, но результаты разные.
Цикл:
https://ideone.com/8oczQe

Замер с помощью timeit, результат - 3.97 секунд

python3 -m timeit "from main import countdown; countdown(100)"
100000 loops, best of 5: 3.97 usec per loop

Если замерять цикл с помощью time.perf_counter(), результат - 9.8 секунд.
https://ideone.com/cS4HjQ

9.873999999999994e-06

1. Почему результаты разные? И как правильно в этом случае?
2. Почему он считает 3.97 / 9.8 секунд, если выполняется буквально секунду-две? Прикидывает среднее время выполнения одной итерации и экстраполирует на остальные итерации цикла? Использование perf_counter дает те же самые результаты, если это важно.
284 2278963
>>78944
Это микросекунды, а не секунды.
А разница из-за способов подсчета, очевидно. Надо разбираться.
285 2278968
>>78963
Порараз бирацца.
Screenshot9.png60 Кб, 973x456
286 2278982
Как правильно сделать кнопку "Назад" в чат боте? aiogram
После возврата не принимает ничего
async def update_text(message: types.Message, action: str):
with suppress(MessageNotModified):
await Form.back.set()
directs = {"rk":"направление1","inv":"направление2","tpr":"направление3","tinv":"направление4"}
await message.edit_text("Выбранное направление: "+directs[action]+"\nВведите тему:", reply_markup=get_back())

@dp.callback_query_handler(callback_direct.filter(action="back"), state=Form.back)
async def callback_back(call: types.CallbackQuery):
await cmd_switch(call.message)
await call.answer()

@dp.message_handler(commands="w")
async def cmd_switch(message: types.Message):
#user_data["username"] = 0
await Form.name.set()
await message.answer("Куда хочешь направить:", reply_markup=get_keyboard())
@dp.callback_query_handler(callback_direct.filter(action=["rk", "inv", "tpr", "tinv"]), state=Form.name)
async def callback_directs(call: types.CallbackQuery, callback_data: dict, state: FSMContext):
action = callback_data["action"]
if action == "rk":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
# await topic_text(call.message)
elif action == "inv":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
elif action == "tpr":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
elif action == "tinv":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
await call.answer()

@dp.message_handler(state=Form.topic)
async def topic_text(message: types.Message, state: FSMContext):
with suppress(MessageNotModified):
async with state.proxy() as user_data:
user_data["Topic"]=message.text
await message.answer("Опишите проблему:")
await Form.next()
Screenshot9.png60 Кб, 973x456
286 2278982
Как правильно сделать кнопку "Назад" в чат боте? aiogram
После возврата не принимает ничего
async def update_text(message: types.Message, action: str):
with suppress(MessageNotModified):
await Form.back.set()
directs = {"rk":"направление1","inv":"направление2","tpr":"направление3","tinv":"направление4"}
await message.edit_text("Выбранное направление: "+directs[action]+"\nВведите тему:", reply_markup=get_back())

@dp.callback_query_handler(callback_direct.filter(action="back"), state=Form.back)
async def callback_back(call: types.CallbackQuery):
await cmd_switch(call.message)
await call.answer()

@dp.message_handler(commands="w")
async def cmd_switch(message: types.Message):
#user_data["username"] = 0
await Form.name.set()
await message.answer("Куда хочешь направить:", reply_markup=get_keyboard())
@dp.callback_query_handler(callback_direct.filter(action=["rk", "inv", "tpr", "tinv"]), state=Form.name)
async def callback_directs(call: types.CallbackQuery, callback_data: dict, state: FSMContext):
action = callback_data["action"]
if action == "rk":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
# await topic_text(call.message)
elif action == "inv":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
elif action == "tpr":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
elif action == "tinv":
async with state.proxy() as user_data:
user_data["username"] = call.from_user.first_name
user_data["Direction"] = action
await Form.next()
await update_text(call.message, action)
await call.answer()

@dp.message_handler(state=Form.topic)
async def topic_text(message: types.Message, state: FSMContext):
with suppress(MessageNotModified):
async with state.proxy() as user_data:
user_data["Topic"]=message.text
await message.answer("Опишите проблему:")
await Form.next()
изображение.png12 Кб, 914x220
287 2279181
Читаю это https://flask.palletsprojects.com/en/2.0.x/cli/
И тут они применяют вот это на пикче. Объясните что это за скрипт, потому как я не понял что это такое и откуда он взялся
288 2279184
>>79181
Я забыл написать, откуда они взяли блядский hello
289 2279187
>>79181
Там же все описано.
290 2279231
>>79187
ПРо hello ничего не написоно я не вижу
291 2279234
>>79231
Читаешь каждую строчку и вникаешь.
Потом можешь почитать, как работает wsgi.
Untitled.png82 Кб, 1324x728
292 2279236
293 2279614
>>79552 (Del)
то есть тебя рпиняли, хотя ты в этом не шаришь? охуеть
294 2279647
>>79635 (Del)
Давай, старайся! Ты должен превозмочь! а что по бабкам?
295 2279656
>>79650 (Del)
ты шкет?
296 2279777
почаны, каким образом можно отобрать папки, в которых есть только файлы с заданным расширением и никаких больше?
то есть все папки, кроме подходящих под условие, не должны попасть в конечных список?
3 день думаю, нихуя не придумаю.
297 2279786
>>79777
Тупо в лоб перебирать, кмк
298 2279788
299 2279805
>>79786
перебирал с помощью glob, listdir - не понимаю, как заставить скрипт игнорировать папки, в которых их нет файлов интересующего меня расширения.
image.png6 Кб, 402x159
300 2279806
301 2279843
>>79806
чел, ты мой герой. я бы еще долго думал до os.walk'а считая его слабее glob и listidir). ну а в цирке походу выступаю я.
302 2279864
Бля, помогите, весь мозг сломал.

class A:
__def __init__(self):
#это конечная операция, не долгая
____self.data = asyncio.get_event_loop().run_until_complete(self.get_data())
____# Тут как сделать вызов асинхронного listen который вечный цикл юзает, чтоб не блокировало программу?

__async def listen(conn):
____async with conn.cursor() as cur:
______await cur.execute("LISTEN channel")
______while True:
________try:
__________msg = await conn.notifies.get()
________except psycopg2.Error as ex:
__________print("ERROR: ", ex)
__________return
________if msg.payload == "finish":
__________return
________else:
__________print("Receive <-", msg.payload)
Я просто хз уже. Вызов слушания блокирует всё, он должен работать всегда.
303 2279875
>>79864

>msg = await conn.notifies.get()


Вот эта строка за каким-то хуем блокирует всё
304 2279957
>>79875
Разобрался
305 2280215
Подскажите как тут грамотно разширить функционал?

Есть такой код https://ideone.com/W9RNzB

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

Но проблема в том, что базовый класс много где используется. И если я отправлю пулреквест на замену всех использований базового класса на свой, то этот пулреквест не пройдёт ревью т.к. мои фичи не везде нужны, но при этом должна быть возможность их везде запускать. То есть идеально было бы это сделать новый класс и от него унаследовать базовый. Но тогда я не смогу использовать методы базового класса внутри нового. Как тогда такого добиться?
306 2280245
>>80215
Делай так, наследуешься от класса, делаешь фичи без флага. Там, где они нужны, создаешь объект от твоего класса, где нет - от базового.
В идеале даже так, Базовый класс с абстрактными методами, Делаешь два класса, которые от него наследуются. Старый класс и твой. Создаешь объект нужного класса на этапе определения есть ли флаг
307 2280308
>>80245

>Там, где они нужны, создаешь объект от твоего класса, где нет - от базового.


Слишком много мест, где придётся заменять базовый класс на мой. Мне так не разрешат. Это должно работать во всех местах где есть базовый класс, но подэфолту выключено. Если я в каждом месте базовый клас заменю на новый и оставлю этот функционал выключены, но на меня как на дурочка будут смотреть если делать так

>Базовый класс с абстрактными методами


Эти методы отлично вписываются в базовый класс. Они не должны там быть абстрактными. Мне нужно просто их расширить.

Думал вариант над mixin. Вот так получилось https://ideone.com/3v1qm9

Но мне нужен порядок вызовов. Сейчас там порядок вызова старта A -> B. Базовый класс тоже унаследован от другого, который унаследован от ещё одного, но супер внутри старт и стопа не вызывает. Поэтому мне надо. Если вставляю mixin, то получаю A -> mixin -> B. А мне нужно A -> B -> mixin чтобы мои фичи самые последние запускались. Такое можно сделать?
308 2280385
Сколько понадобится время чтобы найти работу с нуля каждый день занимаясь по 3-4 часа? Только вот релаьео чтобы найти а не потом год тестовые делать.
309 2280386
>>80385
Это надо склонировать одного вкатуна пару тысяч раз и проивзести статистические подсчеты.
Готов послужить подопытным для вкатологии?
310 2280395
>>80386
Я так чисто интересуюсь, сам даже не планирую. Неужели нет хотя бы примерной инфы от состоявшихся джунов?
311 2280405
>>80308
Я сначала написал ответ, как реализовать нормально надо. Но вижу, что ты уперся в свой флаг и мне не охото стало рассказывать
312 2280503
Почему в sqs fifo таски с одинаковыми id gevent воркер распределяет задачи медленнее чем pool=solo, который делает зто почти моментально?
313 2280505
>>80503
Т.е он получил набор последовательных тасков и выполняет их последовательно с большим интервалом, когда как solo и prefork делают это гораздо быстрее.
Однако у gevent производительность в параллельных тасках гораздо быстрее, для чего он мне и нужен, но если есть только одна последовательность он просто ждет по 10с блядь
314 2280600
>>80308
Нихрена не понятно.

У меня сразу вопрос возникает, ты же не только с классом работаешь, ты скорее с объектами класса работает, а у них будет конкретный тип, вот как здесь ты всё себе представляешь не понятно.

Вот эти флаги смотрятся грязно в любом случае. Тем более, когда у тебя глобальный флаг.

Есть ещё варианты, тоже грязнованые правда, это просто переписать класс в рантайме. То есть ты можешь сделать так, чтобы просто твой Base класс реально указывал на его наследника. Это обезьяньи техники (monkey), такое при тестировании используют, для рабочего кода мне кажется это не очень.
315 2280637
>>80308
Дополню себя >>80600

Тебе надо как-то прояснить, зачем ты это делаешь.

Есть базовые принципы SOLID, они в том, например, что функционал уже существующего кода не должен меняться при доработке классов-наследников. Если люди используют базовый класс, значит им нужен базовый класс. А ты даёшь какой-то дополнительный функционал, и, соответственно, твой класс будут использовать те, кому он нужен. Обычное ООП для этих целей работает очень хорошо.

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

Пример, есть библиотека, где определён класс:
===
class Base:
____def __init__(self, value='default value'):
________print("original base class __init__")
________self.value = value

____def prn(self):
________print(f"Base print, value {self.value}")

def foo():
____b = Base()
____b.prn()
===
Вот допустим, ты хочешь подменить класс, не влезая в код библиотеки, ты просто делаешь
===
import lib

class Magic(lib.Base):
____def prn(self):
________print(f"Magic-print, value: {self.value}")

lib.foo()
lib.Base = Magic
lib.foo()
===
запускаешь

>python3 magic.py


>original base class __init__


>Base print, value default value


>original base class __init__


>Magic-print, value: default value



это monkey-patching
Но для продакшен-целей так делать не надо.

Для продакшен целей делают разные декораторы, либо иные обёртки. Надо смотреть, что у тебя за задача.
315 2280637
>>80308
Дополню себя >>80600

Тебе надо как-то прояснить, зачем ты это делаешь.

Есть базовые принципы SOLID, они в том, например, что функционал уже существующего кода не должен меняться при доработке классов-наследников. Если люди используют базовый класс, значит им нужен базовый класс. А ты даёшь какой-то дополнительный функционал, и, соответственно, твой класс будут использовать те, кому он нужен. Обычное ООП для этих целей работает очень хорошо.

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

Пример, есть библиотека, где определён класс:
===
class Base:
____def __init__(self, value='default value'):
________print("original base class __init__")
________self.value = value

____def prn(self):
________print(f"Base print, value {self.value}")

def foo():
____b = Base()
____b.prn()
===
Вот допустим, ты хочешь подменить класс, не влезая в код библиотеки, ты просто делаешь
===
import lib

class Magic(lib.Base):
____def prn(self):
________print(f"Magic-print, value: {self.value}")

lib.foo()
lib.Base = Magic
lib.foo()
===
запускаешь

>python3 magic.py


>original base class __init__


>Base print, value default value


>original base class __init__


>Magic-print, value: default value



это monkey-patching
Но для продакшен-целей так делать не надо.

Для продакшен целей делают разные декораторы, либо иные обёртки. Надо смотреть, что у тебя за задача.
316 2280738
Читаю Лутца, вроде все понятно, но чувствуется, что эти знания без практики выветрятся.

Например, зачем мне знать про области видимости, про global и nonlocal, если функции я начну писать очень не скоро.

В общем, вопрос: это нормально или лучше читать Лутца, параллельно кодя что-то осмысленноеХочу в pygame что-нибудь сделать, как раз функции буду писать для создания игры
317 2280797
>>80738
Так там тебя не учат этому, просто могут быть структурированные таблички. А так будет по порядку.
Но вообще лутц не лучшая первая книга, это да.
318 2280809
>>80505
Никто не занимался этим?
319 2280815
>>80809
Gevent мало кто юзает с тех пор как появилась нативная асинхронность
320 2280821

>Если позиции товаров повторяются, то в итоговый список попадает суммарное количество товара по данной позиции.


Убил 8 часов на это, еле-еле сделал, ну и сложные задачки, конечно.
321 2280838
>>80821
Че там делать-то?
https://ideone.com/I5aEYD
322 2280859
тестовое сообщение
323 2280864
>>80838
Для меня нереально сложно.
324 2280879
Тема: парсинг.(скорее всего)
Внимание! Вопрос к знатокам.
Сап двач, я собственно из другой сферы программирования, просто стала задача по вебу(батяня попросил написать ему программульку) и я так понимаю для быстрого его решения подойдет лучше питон.
Суть вопроса моего такова:
У меня есть страничка на али (ордер заказа), на ней есть комментарий продавца, который мне надо получить в мою программульку.
одним из вариантов решения я вижу для данной задачи использовать какой нить парсер по типу (Silenium, beautifulsoup )
Важное примечание, что для того чтобы получить инфу надо быть залогининым(вериф идет по почте) как это обойти? Я видел, что с помощью этих фреймов можно проходить обычную верификацию , а можно ли подставить свои куки для обхода этого? и сработает ли это ?
Потом, на сколько я понимаю в ваших вебах сама инфа на страничке генерится жабаскриптом, парсер сможет ее прочитать или он только хтмл + цсс читает ? или как это вообще работает?

Как все делать мне показывать не надо, у меня чисто вопросы по вебу, по выбору фрейма, и то что я тут обсуждаю в теории будет работать ? или какие тут подводные камни ? Просто в альтернативе тогда захерячить какой нить макрос, но мне не хочется делать его , так как это прям всемогущий костыль будет, и может повлиять на юзера(в теории). Либо есть еще альтернативы в решении этой таски? Буду благодарен если кто нить по существу ответит.
всем продуктивного вечера!
325 2280886
>>80879
Насколько я помню, на али весьма злоебучий процесс логина, так что чистыми запросами будет сложно. Так что берешь селениум или какой-то pyppeteer, дергаешь нужные селекторы и все. И не надо парится насчет генерируемого и подругажемого контента. Просто ждешь готовую страницу и забираешь что надо.
В данном случае у питона никаких особых плюсов нет, это делается примерно одинаково везде.
326 2280895
>>80886
Благодарю вас
Я почему то думал, что это надо попробовать через парсер как то делать , но вот вижу, что через селениум можно браузер эмулировать.
Еще раз спасибо.
327 2280906
>>80864
Почитай про словари.
1642998633264.jpg87 Кб, 1200x1200
328 2280965
>>80906
Да я знаю про славри и методы, но до такого:

>items.setdefault(name, {}).setdefault(item, 0)


чтобы догадаться надо иметь IQ > 140 явно, какой-то космос tbh
329 2280993
>>80815
Как и селери?
Что вместо очередей теперь используют?
Мне надо распределять запросы на последовательную обработку по определённому идентификатору в самом запросе.
Делаю чаты. Мне приходят сообщения с разных чатов и я отправляю их в другой сервис с чатами. В пределах одного чата нужен порядок.
330 2280994
>>80993
Я в вебе буквально полгода, многих технологий могу не знать. Единственное что нашёл это селери и fifo очереди. Основной сервер на gunicorn с одним инстансом, который сразу отправляет данные в очередь, где они дальше распределяются.
Понимаю что под нагрузкой он не сможет работать адекватно. Запускал на uvicorn, производительность атас, но порядка нет никакого.
331 2280996
>>80993
Я не понял причем тут селери относительно предыдущего вопроса, оно вполне себе юзается. Хотя ты упомянул селери в контексте очередей и для этого какой-нибудь кролик лучше подходит.
332 2281027
>>80996
С брокером проблем нет. Проблемы именно в работниках, которые тупят по 10с прежде чем забрать следующий таск в случае с gevent воркерами. Prefork так не делает, а solo вообще без тормозов.
Но gevent нужен для лучшей масштабируемости
sage 333 2281145
Как использовать символ \, чтобы он не экранировал?
334 2281160
Есть строка:
string = '1. 0.1, 0.2, тест, тест. ' \
'2. тест, тест, 0.5=0.3+0.2.'
Нужно заменить точки на запятые только в тех местах, где они отделяют дробную часть числа, чтобы было вот так:
string = '1. 0,1, 0,2, тест, тест. ' \
'2. тест, тест, 0,5=0,3+0,2.'
Как это сделать?
Только без костылей типа string = '1. ' + '0.1, 0.2, тест, тест'.replace('.', ',') + '. 2. тест, тест, ' + '0.5=0.3+0.2'.replace('.', ',') + '.'
335 2281163
336 2281205
>>81145
мб \\
337 2281236
>>81160
/\ или \\
338 2281284
Есть два стула списка:

my_list_1 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
my_list_2 = [2, 1, 4, 5]

Хочу удалить из первого списка элементы, присутствующие во втором списке.

Почему код вида:

for number in my_list_1:
if number in my_list_2:
my_list_1.remove(number)

Не удаляет все единицы и двойки из списка my_list_1?
339 2281296
>>81284
1. Потому что нужно читать документацию

>If a list contains duplicate elements, the remove() method only removes the first matching element.


2. Потому что так писать вообще не стоит. Ты на пустом месте получаешь n^2, хотя задача решается за линейное время.
[x for x in my_list_1 if x not in set(my_list_2)]
340 2281300
>>81284
ну и в догонку - ты меняешь коллекцию в процессе итерации. Так не надо делать.
341 2281320
>>81296

>x not in set(my_list_2)


Это линейное что ли?
342 2281321
>>81320
Это константное. А x for x in my_list_1 - линейное. В сумме линейное
343 2281323
>>81321
Это логарифм от размера my_list_2 (и set в лямбде тоже ленивый получится, то есть, пердон его на каждой итерации будет из листа переделывать)
344 2281327
>>81322 (Del)
Просто ты умница, а остальные даунята.

Ты ведь это хотел прочитать?
345 2281330
>>69498
Если не пограммист, то зачем тебе сравнение интеграторов?
346 2281340
>>81296

>1. Потому что нужно читать документацию


>If a list contains duplicate elements, the remove() method only removes the first matching element.



Что интересно, итоговый my_list_1 выглядит так: [1, 1, 2, 2, 3]. То есть почему-то удаляется две единицы и две двойки. Если бы удалились по одной, то всё было бы понятно. Но почему работает так?
347 2281344
>>81323
Ты че, на плюсах пишешь обычно? Тута у нас set через хэшмап сделан, а не кчд.
Да и даже логарифм растет медленнее линейной функции, так что в сумме все еще O(n)

>и set в лямбде тоже ленивый получится


Да господи, это же общая идея. Скасти его заранее же.
348 2281345
>>81332 (Del)
Потому что все люди разные и с разными интеллектуальными способностями.
ваш кэп-крокодил
349 2281348
>>81340
Потому что ты меняешь коллекцию в процессе итерации же:
In [8]: my_list_1 = [1, 1, 1, 1, 2, 2, 2, 3, 4]
...: my_list_2 = [2, 1, 4, 5]

In [9]: for i, number in enumerate(my_list_1):
...: if number in my_list_2:
...: my_list_1.remove(number)
...: print(i)
...: print(my_list_1)
...:
...:
0
[1, 1, 1, 2, 2, 2, 3, 4]
1
[1, 1, 2, 2, 2, 3, 4]
2
[1, 1, 2, 2, 3, 4]
3
[1, 1, 2, 3, 4]
4
[1, 1, 2, 3]
350 2281352
Кто-нибудь учил джанго по мануалу от мозиллы https://developer.mozilla.org/ru/docs/Learn/Server-side/Django
есть русик, на гите есть код. В целом вроде все рассказали и разжевали. Остается только повторить успех.
351 2281409
>>81348
Всё равно непонятно: почему на итерации 2 удаляется двойка из списка, а не единица?
352 2281413
Ебаный ваш рот блядь, что тут за порашный свинарник?!
353 2281419
Был. Хе-хе.
354 2281425
>>81409
Ты удаляешь первое вхождение и всё сдвигается назад.
355 2281469
Какой модуль для питона, чтобы изменять PDF-файлы? Есть некоторый PDF-файл, надо через код заполнять поля.
PyPDF2 не имеет такого функционала.
изображение.png225 Кб, 480x360
356 2281516
>>81332 (Del)
Декораторы, асинхронность
357 2281566
>>81316 (Del)
На ютабах и гите нет моих задач. Везде хеловорлды пишут, а чего-то реального нет.
Никто не хочет делиться опытом, чтоб не было конкуренции и они были незаменимыми на рынке.
358 2281571
>>81332 (Del)
Так ты просто скрипт сделал, это хуйня из под коня.
359 2281577
>>81352
Учил джангу на боевом сервер, ибо
КОГДА ГОТОВ? СКОЛЬКО ВРЕМЕНИ НАДО?
@
НЕДЕЛЬКИ ХВАТИТ ЧТОБ СЕРВЕР СДЕЛАТЬ?
@
ДАВАЙ ТЕСТИТЬ
@
ТЕСТЫ ДЕЛАЮТСЯ РУКАМИ, ТЫКАЮТ КНОПОЧКИ, О ЮНИТ ТЕСТАХ НЕТ И РЕЧИ
@
НУ РАБОТАЕТ, ДАВАЙ НА ПРОД
@
ОЙ А ПОЧЕМУ ЭТОГО НЕТ, НАДО ЧТОБ БЫЛО
@
ПОЧЕМУ НЕ РАБОТАЕТ ФРОНТ? ПОХУЙ ЧТО ТЫ НА БЕКЕ
360 2281594
>>81322 (Del)
Че-то всё вперемешку.
Ну показал что можешь пользоваться либой дискорда и асинки везде делать. Это как бы одна из базовых вещей. Ну и всё на этом. У тебя все происходит в либе, абсолютно всё.
Как будешь деплоить? Это ж бот, он как бы и сервер иметь должен свой наверное не?

Короче мешанина непонятная. Нет внятной точки входа. Кажется будто это просто часть какого-то другого проекта либо сделано как тестовое. С учётом нулевого опыта можно снисходительно оценить.

Как боевой проект - однозначно нет.
Для начала, разделяй бизнес логику от основной. В мейне расписывать методы НЕЛЬЗЯ, там должна быть ТОЛЬКО точка входа. В бизнес логике методы расписывать НЕЛЬЗЯ. Методы расписываются в другом месте. В твоём случае отдельным файлом типа tasks. Нет настроек, чем окружение разделять будем? Где requirements? Чем демонизировать?
Разумеется, этого всего можно не делать, если вы не собираетесь поддерживать свою хуйню уже с завтра. Но если вы позиционируете себя как ниибаца крутой, будьте любезны делать всё по стандартам.
361 2281598
>>81594
Ой, что там расписывать, стандартная лапша.
Это как в языках с визуальной разработкой нубы накидывают на форму контролов и хуярят все в обработчиках событий.
Но гонору пиздец.
362 2281599
Дайте какую-нибудь идею новичку, к которой двигаться и реализовывать её, попутно учя язык.
363 2281608
>>81599
Единственное что могу сказать - делай рабочий проект. Не калькуляторы или какой-нибудь демонстрационный проект для портфолио, а то чем ты будешь пользоваться, чего тебе не хватает или другим.
У тебя будет стимул писать хорошо, поддерживать свой код, крутить-вертеть по всякому. А если ещё и получать прибыль с него это вообще стимул стимулов.
364 2281615
>>81608
Но мне ничего не надо и я ничем не пользуюсь. Ну написал я сохранятель картинок в треде с двача, как кто-то посоветовал, но им нет смысла пользоваться, так как в любом треде обязательно будет картинка с говном или гомосеком.
365 2281618
>>81615
Ну, например, сделай к тому же сохранятелю картинок чтоб он проверял дубли.
366 2281620
>>81618
Не те картинки которые 1в1, а разных размеров, например, или какой-нибудь фигней типа мелкой надписи сбоку, чтоб он считал их одинаковыми
367 2281659
>>81615
Храни папку картинко с говном, и проверяй на вхождение, когда сохраняешь
368 2281732
ВЫЗЫВАЕТ МЕТОД ИЗ ЛИБЫ ИСПОЛЬЗУЯ AWAIT
@
КРУТО
@
ПРИ ЭТОМ ЮЗАЕТ IF SOME: PASS
@
ДА ВАЩЕ ИЗИ ТУТ ВСЁ СПРАШИВАЮТ

Чет проиграл с этого дебила
369 2281781
>>81594
Ну и логирования нет. Куча try except pass и ни одного сообщения, даже info. Когда будут косяки будешь по полчаса искать их.
370 2281827
Не спалось прошлой ночью, от нефиг делать открыл гайды по этому вашему питону и за пару часов запилил скрипт, который вытягивает нужные данные по апи яндекс метрики, оформляет их как таблицы и раскладывает по файлам, которые потом на php через include_once собираются в один общий отчет.

Покидайте идей чего еще интересного можно попробовать на нем сделать. Гуглил useful python scripts, но такого чтоб прям зацепило не находится.
371 2281995
Нашёл ещё одну странность при работе с celery и gevent воркерами в sqs.
Если таски делает один поток (из одной очереди), то он делает очень большие паузы, между ними, за каким-то хуем привязанные к wait_time_seconds.
Если таски разбирают два и более потока одновременно, то они разбирают их очень быстро, без пауз. Менял все конфиги, пробовал разные настройки - результат такой же.

Я уже просто заебался гуглить эту хуйню. Такое чувство будто никто с этим не сталкивался.
372 2282036
Сап, нужно убрать из строки все нестандартные символы типа пикрил1 и оставить между словами обычные пробелы. Попробовал сделать способом как на пикрил2, но оно не работает. Что я делаю не так?
373 2282041
>>82036
Что это за редактор так показывает?
Сам исходник питоний у тебя как утф сохранен?
374 2282043
>>82041
Алсо, зачем построчно? Так для целого текста и хуярь реплейсом.
375 2282046
>>82041
Исходник в utf-8, показывает так PyCharm. На пике длинные пробелы типа табов, U-2004 в таблице символов винды
376 2282048
>>82043
Построчно т.к. я удалял последнюю строку, где указан год написания. Потом будет нужно разбить этот текст на отдельные слова и посмотреть, какие встречаются чаще всего, поэтому даты не должны портить статистику
377 2282049
>>82046
Лол, только сейчас заметил, строки же иммутабельны.
Надо делать str = str.replace
Алсо, лучше переделай на имена, т.е. str.replace("\N{THREE-PER-EM SPACE}", " ") и т.д.
рулет очка 378 2282055
Имеется некоторое количество переменных, которые постоянно увеличиваются в количестве. Мне нужны только последние 30 шт. Как записать их в массив/список, удалять старые и читать только несколько последних? Есть в питоне такие функции?
379 2282058
>>82055
Генераторы и списков смотри
380 2282059
>>82055
Подробнее расскажи, не совсем понятно.
381 2282060
>>82049
Неа, даже так не сработало. Странно, что раньше интерпретатор вообще не ругался на мою попытку реплейснуть строку.
382 2282061
>>82036
Сделай через regex
383 2282062
>>82060
Ну хз, где-то ты накосячил, разбирайся.
https://ideone.com/svsrqo
384 2282063
>>82059
Рандомайзер генерирует число. Это число записывается в некоторый список. Мне не нужно больше 30-и последних, т.е. список должен быть ограничен и при добавлении нового числа, 31-е должно удаляться. Также из этого списка я должен читать и сравнивать некоторое их N-ное количество.
386 2282068
>>82063
Сделай свой класс
387 2282070
>>82067
Ого, спасибо! Как эта йоба работает?
388 2282073
>>82070
Читай доку https://docs.python.org/3/library/collections.html#collections.deque
Почти тот же список, но с дополнительными плюшками. А можешь и в список перегнать через list(q).
389 2282077
>>82060
>>82062
Ха! Эта штука заработала, когда я начал сразу записывать строки в файл, не дожидаясь обработки всего текста. Чувствую себя пиздец победителем, спасибо за помощь, анончик :)
390 2282104
Есть тут кто диплом на пистоне писал? Лучше юзать ORM или сырыми запросами базу инициализировать и данные вытаскивать?
391 2282118
>>82104
Орм
392 2282134
Нашёл ещё одну странность при работе с celery и gevent воркерами в sqs.
Если таски делает один поток (из одной очереди), то он делает очень большие паузы, между ними, за каким-то хуем привязанные к wait_time_seconds.
Если таски разбирают два и более потока одновременно, то они разбирают их очень быстро, без пауз. Менял все конфиги, пробовал разные настройки - результат такой же.

Я уже просто заебался гуглить эту хуйню. Такое чувство будто никто с этим не сталкивался.
393 2282147
>>81469
Через PYPDF2 (вроде) можно было сам постскрипт менять, но это гемор еще тот.
Pymupdf что-то такое мог: https://github.com/pymupdf/PyMuPDF/issues/201
394 2282225
>>82134

>wait_time_seconds


А оно за что отвечает? Мб задания дублируются как-то?
395 2282309
>>82225
Это амазоновский параметр, регулирует вроде как частоту опроса или хз что вообще.
Просто суть в том что если gevent обрабатывает таски в нескольких тредах, то всё ок, но если только в одном треде - время между тасками равно этому параметру.
396 2282314
>>82309
Просто сейчас создаётся впечатление, что воркер фризится и не знает какому треду отдать таск, из-за этого он не даёт его никому и ждёт пока селери опросит очередь.
Хотя по идее, он забирает данные сразу пачками, короче хз, какая-то залупа происходит.
pool solo работает очень быстро, prefork медленнее, а gevent вообще ждёт по 10с.
Я делаю тест, просто вывожу сообщение в лог, т.е нагрузки нет никакой
397 2282315
>>80395
Хуйфы.
Как учиться, чему учиться, с какой целью.

На веб-дебила:
1. Язык, чтобы не спрашивать каждый раз "а что такое дикаратор" или "ой че-та библиотека не подгружается" или "пук строку не могу ревеснуть стак лох оверфлоу памахи"
Для этого нужно ботать книжки или доку. Ты конечно можешь сразу сесть и кодить, но это путь говнокодера, т.к тонкости языка пройдут мимо тебя.
2. Фреймворк. Нужно прочитать доку + сделать пару петов.
3. Основы веб: хттп, тлс, хэши, криптография, хтмл, ксс, основы сетей (базовое понимание как вообще запросы от юзера к сайту идут)
4. Инструменты: гит, гитхаб и прочая ссанина.
5. Базы данных.
398 2282353
>>82315
Чтоб учиться нужен стимул и время.
У тебя дохуя времени, учишь тонкости-хуенкости, считаешь байтики, дорожки на платах, вычисляешь сопротивление, считаешь схемы транзисторов, как делаются процы. И всё ради того чтоб просто сервер поднять. А зачем это всё надо знать? Надо, ведь иначе ты говнокодер. Но да ладно, предположим что всем этим он будеть заниматься.
А какой у него будет стимул для этого? Ну, т.е он учит чего-то, но не видит результата, для этого нужен проект. Он не может просто писать код без задней мысли, потому что тогда станет говнокодером, ведь он ещё не знает как устроены конвейеры в проце.
Работать? Работать он не сможет.

Учить ради учебы? Т.е делать монотонные действия без стимула? Это один из диагнозов аутизма, если что, такие в принципе не достигнут вменяемого результата, ведь у него нет стимула, он напишет какую-нибудь бесполезную и неработающую хуйню, которая ее приносит прибыль. Для чего? Чтобы что? Показать что ты чего-то можешь? Кому показывать?

Чтобы учиться кодить надо кодить. Просто брать задачи и делать, остальное будет приходить в процессе. Не надо бояться говнокодить, все проходят через говнокодинг. Ты ж когда был пиздюком в 1.5 годиков и учился говорить, не начинал же с грамматики, правильно? Здесь то же самое.
399 2282372
>>82353

>У тебя дохуя времени, учишь тонкости


До уровня транзисторов доходить не надо, но основные конструкции языка + подводные камни лучше изучить до активного кодинга.

Просто чтобы не быть как те челы выше, которые не могут из стандартной либы функцию загуглить для решения простейшей задачи(например, деку). А что он будет гуглить, если даже не знает что такое дека и что она вообще есть в питоне?

С остальным тоже самое: как ты будешь какое-нибудь веб-приложение писать, если не понимаешь хотя бы на среднем уровне как работает фреймворк? По туторам с ютуба будешь кодить? На каждую ситуацию тутора нет, а дока написана с учетом того, что человек знает язык, на котором она написана.
400 2282389
>>82372
Дока зачастую написана уебищно, функции можно узнать по definition и то не всегда. Для этого не нужно знать чего-то сверх.
С фреймворками та же история, гуглишь базово как им пользоваться, а остальное в процессе.
Очень важно первостепенно сделать что-нибудь что работает, а оптимизацией занимайся потом. Не наоборот. С опытом придёт понимание как надо, а как не надо.

Если человек не может сам что-то делать и гуглить, значит он не умеет учиться самостоятельно, это уже проблемы совсем другого уровня. Он либо без вышки, где его учат учиться, внезапно, либо совсем без мозга.
123.jpg85 Кб, 1283x508
401 2282396
Анон, прислали тестовое на джуна, помогай!
1) сущности - это же про модели? Правильно понимаю, что надо использовать связь многие к одному? (ингредиенты к одному рецепту)
2) Про JSON REST API в душе не ебу, но речь про функции представления? (views)
3) Написано делать бэкенд - то есть и шаблоны (templates) тоже пилить надо?
402 2282400
>>82396
А сколько времени дают на такое тестовое?
123.jpg66 Кб, 1548x284
403 2282403
>>82396
Дополнение.
>>82400
До 7 февраля.
404 2282411
>>82403
7 дней на эту хуйню?
Как вы с такими тестовыми умудряетесь не вкатиться?
405 2282419
>>82411
Да я и не собирался неделю пилить всё это. Просто уточняю у вас моменты эти, дабы не оподливиться. По факту проект у меня есть похожий, собирался сделать ctrl c - ctrl v.
406 2282421
>>82419
Гугли DRF
407 2282471
Няши, что-то я не понимаю, как пользоваться асинхронными итераторами. Вот как это запустить?
https://pastebin.com/tW1G4rp9
409 2282481
>>82403
Тебе его оплачивают?
410 2282485
>>82396

> сущности - это же про модели?


Ага

>Правильно понимаю, что надо использовать связь многие к одному? (ингредиенты к одному рецепту)


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

> 2) Про JSON REST API в душе не ебу, но речь про функции представления? (views)


Загугли, если не ебешь - с гугления программирование и начинается.
API - скорее control, а не view, если говорить в терминах MVC.

> Написано делать бэкенд - то есть и шаблоны (templates) тоже пилить надо?


Нет. шаблоном(представлением) данных в твоем случае будет их сериализованное в json представление.
изображение.png36 Кб, 783x250
411 2282490
>>82478
А как? Я пробовал всяко, не получается.
412 2282505
>>82485
Благодарю
>>82481
Нет, офк. Я же вкатывальщик на джуна.
413 2282508
>>82490
Прочитать текст ошибки.

>asyncio.run(AsyncFunc)


Ты запихиваешь в run функцию вместо корутины.
А корутина в данном случае - это то, что AsyncFunc возвращает
asyncio.run(AsyncFunc()) должно быть.
Но все равно не заработает. У тебя в __anext__ count вместо self.count.

Ну и не используй camelCase для функций.
414 2282658
>>82508
Вот спасибо, всё понял.
Осталось ещё понять, в чём преимущество асинхронных итераторов, ведь всё равно они выполняются последовательно.
Я так предполагаю, что они нужны потому что в обычных итераторах нельзя сделать await и подождать выполнения какого-то асинхронного кода.
Но опять-таки, непонятно, почему нельзя. В джаваскрипте же, вроде, можно писать await где угодно перед промисами.
415 2282671
>>82658
__iter__ и __next__ это синхронные функции, которые пишутся через обычный def, в них нельзя await писать
416 2282678
>>82671
А вот почему в обычной функции нельзя написать await? inb4 потому что
417 2282821
>>82678
Потому что вызов асинхронной функции порождает корутину и она до закидывания в луп не исполняется, а вызов обычной какой-либо результат сразу. Можно конечно было бы забить хуй и заставить интрепретатор определять что эта за хуйня на момент создания функции по наличию ключевого слова await, но это неудобно в том числе и для программиста во время чтения кода.
418 2282842
>>82821
А в чём разница для программиста, кроме того, что он как минимум ещё одну функцию должен объявить с async, а потом ещё и передать ей управление, вместо того, чтобы просто сделать await в обычной функции?
419 2282848
Ачё всмысле, где асинхронность
420 2282851
>>82848
Это синхронный слип.
421 2282864
>>82851
И принт тоже синхронный?

Я-то думал мы пишем типа
t1 = await go()
...
...
if t1:
...
и он запускается в момент await и спустя какое-то количество строк кода, когда мы вызываем результат t1 он либо ждёт результата, если не успел, либо даёт результат

Если это работает не так, то это ж пиздец. Ладно, буду дальше посмотреть
422 2282868
>>82864
Ладно, хватит каламбура. Как провернуть такое с requests?
423 2282870
>>82864
Просто обычный слип блокирует весь скрипт, вместе с лупами и залупами.
425 2282921
>>82864

>и он запускается в момент await и спустя какое-то количество строк кода, когда мы вызываем результат t1 он либо ждёт результата, если не успел, либо даёт результат


Не. При await следующие строчки не выполнятся, пока не завершится та асинхронная функция, которая указана после await.
А вот, кстати, хрен знает, как сделать так, как ты описал. Кроме как через asyncio.gather.
>>82868
Очевидно, заменить его на httpx.
https://www.youtube.com/watch?v=m_a0fN48Alw
426 2282948
>>82921
Жаль. В любом случае пока пользуюсь threadpoolexecutor и внимательно ищу узкие места где можно было бы сделать что-нибудь ещё помимо прочего.
Может когда-нибудь перейду на асинки. Когда сменю джангу на что-нибудь другое.
427 2282955
>>82864

>И принт тоже синхронный?


Конечно.
А слип, видимо, слипу рознь. Наверное, этот слип отдаёт управление от питона операционной системе. А тут нужен asyncio.sleep, наверное, чтобы отдал управление эвент лупу, запущенному в asyncio.run
428 2282958
>>82882
Создание таски автоматически закидывает корутину в луп, где начинается ее выполнение, последний await отрабатывает сразу, так как к этому моменту она уже закончена.
429 2282966
>>82882
Вообще непонятно, что тебя тут смущает. Ожидаемый результат же.
430 2283003
>>82842
А как ты декоратор тогда напишешь?
А как ты при наследовании будешь поступать?
А что, если я не хочу await-ить крутизну, а хочу ее через таск запустить?
Ну и нужно понимать, что корутина - это все всего лишь хитровыебаный генератор, а не какая-то магия.
431 2283089
щас обнаружил что если создать функцию в которой любой аргумент по умолчанию пустой список, то при вызове этой функции несколько раз без "необязательного" аргумента она вызывается с одним и тем же списокм

например
def test(a, b = []):
b.append(a)
print(b)

test(1)

>> [1]


test(2)

>> [1, 2]


test(3, [])

>> [3]


test(4)

>> [1, 2, 4]



Как мне этого избежать, но сохранить возможность пустого списка как параметр по умолчанию?
432 2283092
>>83089
Вопрос решён самостоятельно
b = none
if not b:
b = []
bla bla bla
433 2283114
Пилю гайд как выучить наконец-то джангу.

Смотрим джангу за час, или быстро читаем доки примеры с опросами.
Далее. Находим начинатора. Я выбрал divanov11 и его репу. Он пилит сайты на джанго.
Начинаем читать чужие коды.
Как читать.
Смотрим в самом проекте на урлы и сеттинги. Тут все.
Далее в самом эппе смотрим
Модели, формы, урлы и вьюшки. Именно в таком порядке читаю. Понял вообще все.
Далее что почитать.
Чужие коды искать на гите так
туду эппы, маст хэв, понимается круд технология.
всякие блоги хуеги
можно почитать туторы от мозиллы, и сделать их задание сделать блог, но я и так нашел и чекнул на гите.
Начинаем пилить хелло ворд на джанге. Далее думаем о шаблонах. Кроме красивых шаблонов в джанге проблем я не нашел. Любой чих задокументирован, куча примеров на гите.
434 2283125
>>83114
Улица Герцена, ты?
435 2283126
>>83114
Вот я делаю приложуху на джанге и хочу чтоб все рендерилось на стороне сервера, то есть чтоб на клиенте js было по минимуму. И как быть со всеми этими шаблонами? Там же анрил как-то порядок держать. А ещё если из шаблона передавать данные в js скрипт, то это вообще каша получается и боль.
436 2283169
>>83003

>А как ты декоратор тогда напишешь?


>А как ты при наследовании будешь поступать?


Не понимаю, чем await внутри обычной функции помешает сделать ей декоратор или как await внутри обычного метода помешает его переопределить.

>А что, если я не хочу await-ить крутизну, а хочу ее через таск запустить?


А что этому помешает, если await можно будет внутри обычных функций использовать?

>Ну и нужно понимать, что корутина - это все всего лишь хитровыебаный генератор, а не какая-то магия.


Всё равно не понимаю. В чём проблема дождаться завершения работы хитровыебанного генератора в обычной, а не асинхронной процедуре?
изображение.png32 Кб, 1312x358
437 2283280
>>82658>>83169

>пОчЕмУ нЕлЬзЯ пОдОждАтЬ коРуТиНу вНе аСинХроНноЙ фУнКциИ


>в жАбАсКриПтЕ мОжНа


Шизоебанаты.
438 2283295
>>83280
Ты мудак?
Ну, в джаваскрипте тоже нельзя. Но почему?
439 2283306
>>83295
Прочитать два абзаца о том, что такое корутина и как они реализованы не можешь ты, а мудак я. Ясн.
440 2283315
>>83306
Ты хочешь сказать, что это просто?
То есть ты не можешь на простой вопрос ответить, и вместо этого начинаешь писать оскорбления, и после этого ты не мудак? Ясн.
Про какие два абзаца ты написал - вообще непонятно. Ты хоть понимаешь, что в интернете миллиарды абзацев?
441 2283326
>>83315
2д22 год, а программисты все еще не знают, как искать информацию в интернете. Классика.

https://lmgtfy.app/?q=python+await+outside+async+function&iie=1

Держи. И не говори потом, что я мудак, оскорбляю тебя, и не помогаю.
442 2283347
>>83326
Мудак. Потому что мог бы либо помочь не оскорбляя, либо пройти мимо. С чего ты вообще взял, что я программист? Может, я таксист? Ты вот знаешь, где улица Есенина? Не знаешь? Шизоебанат, загуглить не можешь?
А ссылка твоя хуёвая, не работает нихуя. Она же по логике вещей должна гуглить за меня, а она не гуглит, только делает вид, что собирается погуглить. Это какое-то наебалово. И вообще, на английском непонятно. На русском два абзаца дай. А пока не дал - не пытайся умничать, что кто-то не может их прочитать.
443 2283353
>>83347
Хуево быть тобой, за два часа не смочь найти ответ.
Ну, значит, не особо он тебе и нужен, таксист вполне себе хорошая профессия.
444 2283374
>>83353
Я и не искал. Ты ведь сказал, что для этого нужно прочитать два абзаца, и я жду, когда ты уточнишь, которые именно. А ты юлишь жопой. Наверное, ты просто боишься, что я брошу таксовать и отберу у тебя рабочее место с зарплатой 300 к в наносек.
445 2283470
Такой вопрос. По джанго.
Есть два хтмл файла например.
home.html
blog-page.html
Простой блог. Где домашняя и там где будут статьи.
Так вот. Как сделать пагинацию чтобы все это дело множилось?
446 2283509
Есть ли в джанге сигнал апдейта модели через .update? Гулятся только костыли.
447 2283528
>>83470

>Как сделать пагинацию чтобы все это дело множилось?


Без задней мысли. Ты делаешь запрос, в ответ тебе приходит json с какими-то там статьями, штук 30 например, ты их рендеришь в шаблоне. И делаешь ссылку на следующие 30 штук
448 2283610
Как передать аргумент в функцию данном случае?

Вот функция:

def savetofile(filename):
file = open('{filename}.csv', 'w')
...

Вот вызов:

savetofile(001)

В итоге вместо создания файла 001.csv создается файл {filename}.сsv
449 2283629
450 2283642
>>83528
А если я типо сам вылаживаю статьи?
451 2283648
Блин, не понимаю. Куда вводить пасскод?
Вот метод massege принимает параметр passcode, это булевая переменная, а куда сам пасскод-то назначать? Почему у двача такая уебищная документация...
452 2283663
>>83610
f, format, % дохуя способов.
Сразу проиграл, вспомнив, что у пистона ДОЛЖЕН БЫТЬ ОДИН СПОСОБ СДЕЛАТЬ ЭТО И ПРИ ЭТОМ -САМЫЙ ОЧЕВИДНЫЙ
453 2283668
>>83648
Открыть исходник и посмотреть, как оно там сделано.
454 2283680
>>83663
Ну и очевидно, что f-strings самый правильный. А остальные оставлены для обратной совместимости. Короче, нужно тонкости языка знать и понимать, впрочем, как и везде
455 2283688
>>83680
Юзаю везде format, что я делаю не так?
456 2283690
>>83688
Юзай f-string, они быстрее и удобопонятнее.
457 2283808
>>83374

>нужно прочитать два абзаца, и я жду, когда ты уточнишь, которые именно


>отберу у тебя рабочее место с зарплатой 300 к в наносек


О дивный манямир
458 2283833
>>83629
>>83663
>>83680
Окей, подставлять переменную в название файла получилось:
file = open(f'{filename}.сsv', 'w')

А как быть вот с такой конструкцией?
file.write(tabulate({filename}().to_values(), headers=headers, tablefmt="tsv"))

Максимум что получается через f-string - это записать строку "tabulate(название файла().to_values(), headers=headers, tablefmt="tsv")" в файл "название файлаю.csv". В остальных вариантах {filename} вообще не распознается.
459 2283861
>>83833
Бля, чел, не дави тупостью, если у тебя там какие-то операции над переменной - сделай новую
filename = '_'.join(filename.to_values())
file.write(f'tabulate{filename}.csv') Или что там у тебя
460 2283895
>>83690
Т.е. если мне надо маппинг распаковать, писать f'{mapping["key1"]} ... {mapping["key2"]} ... ' вместо '{key1} ... {key2} ... '.format_map(mapping) ? Принял к сведению))
461 2283951
помогите преобразовать spisok = ['1 2 3', '4 5 6'] в [1, 2, 3, 4, 5, 6]
пробовал через for n in spisok но чет жидко обосрался с ошибкой <generator object <genexpr> at 0x01E14F00>
462 2283953
Что я делаю не так?
463 2283993
>>83953
Палишь паскод
464 2283996
>>83953

>usercode

465 2283998
>>83808
Ну так не бойся и покажи, что за абзацы такие.
466 2284001
>>83996
Бляяя, анон, спасибо! Пиздец я долбоеб слепой, уже полчаса сижу тыкаю, не могу понять в чем проблема.
467 2284005
>>83953
Ничё не замечаешь?
468 2284007
>>84005
А, подсказали уже.
Конечно, макака долбоёб. Везде пасскодом называет, а в апи нет - юзеркод, блядь, а потому что на хуй пошли, вот почему.
469 2284012
>>84007
Чтоб такие как ты ее взламывали макабу.
Я бы вообще использовал какой-нибудь md5 вместо названия поля
470 2284021
>>83951
Чё-то типа
puk = [*pok.split(..) for pok in kok]
Только я не помню как разворачивать его, наверное ещё надо что-то сделать. Ну или вариант на две- три строки
471 2284028
>>83895
Конечн принимай, принимай ещё что фстринги быстрее
image.png13 Кб, 953x58
472 2284033
>>83953
>>83996
>>84005
>>84007
Короче, пацаны, с юзеркодом я конечно проебался, но мне бы консоль написала, что инвалид параметр, проблема была в том, что Get запросы не принимают message body, только хэдеры, нужно вот эту хуйню перед параметрами добавлять
473 2284069
>>84021
itertools.chain.from_iterable
474 2284079
>>84069
>>84021
>>83951
In [1]: import itertools

In [2]: puk = ['1 2 3', '4 5 6']

In [3]: list(map(int, itertools.chain.from_iterable([pok.split(' ') for pok in puk])))
Out[3]: [1, 2, 3, 4, 5, 6]
475 2284112
>>84033
В доке же написано запрос с параметрами. Тебе надо params.
476 2284128
>>84079
>>84021
хуя жеские. Я не знал про itertools и map (я только учусь), и смог вывести ['1 2 3', '1 2 3'] через цикл с с записью в пустой массив с исключением пробела. Получилось

>puk = ['1', '2', '3', '1', '2', '3']


А требуется

>puk = [[1,2,3][1,2,3]]


Простым словом, я изначально сам себе неправильно поставил задачу и теперь надо как-то исправлять.
477 2284134
>>84128
Убрать itertools, внести внутрь map, дальше сам
478 2284141
>>84134
Я пока еще не дошел в курсе до itertools и map, предполагается что я решу все с помощью циклов. Думаю с помощью цикла проверить каждый элемент, в него вложить цикл с условием который будет менять символы пробелов в элементах на запятую, и потом надо будет вспомнить как поменять значение в элементе с str на int через его индекс.
479 2284147
>>84128
Хз в чём проблема, так даже проще
puk = [int(pok.split(" ") for pok in kok)]
480 2284152
>>84079
Зачем так сложно
puk = []
[puk.extend(pok.split(" ")) for pok in kok]
image.png23 Кб, 1101x153
481 2284182
Есть класс который подгружает аттрибуты в реальном времени из файла
Аттрибут всегда лямбда функция где ВАЖНЫЙ параметр это имя самого аттрибута (поэтому загрузка из файла что бы в лямбду передать строку)

Дальше будет сложно объяснить, но я хочу лишиться парсинга из файла

Могу ли я сделать так что бы имея одну фунцию и при написании object.blablabla я бы получал ссылку на свою функцию куда в параметр будет передан аттрибут blablabla ?
Блять пиздец я тупой даже не знаю как скачать что мне нужно
Послушаешь себя так у меня шиза вообще, но функция везде реально одинаковая, отличается только одна строка переданая в параметр


на пикче мой шизокод
Проблема в том что при обновлении api мне нужно будет обновлять файл и записывать туда новые функции и выписывать старые, а вообще похуй на самом деле чё в функцию передавать, если у api такой функции нет, он мне просто ошибку вернёт, поэтому тут уже мне нужно будет следить что я пытаюсь вызвать
482 2284184
>>84182
Ты хуйней какой-то занимаешься.
https://ideone.com/wCVZiE
483 2284185
>>84184
Ебать, спасибо огромное
Живи век добрый человек
484 2284249
>>72662
Вот такую еще тему нашел, для перекатывающихся.
https://github.com/eugeneh101/Advanced-Python
485 2284258
>>83895
Если у тебя такая вереница получается, которую нельзя свести к более простой конструкции, значит ты пишешь говнокод
486 2284295
>>84258
Не, это говноязык
487 2284314
>>84152
В int преобразовать не забудь
488 2284323
>>84182
Сделай просто py файл. Зачем такие изьебства. Хранить конфиги в py это нормально
PepeNote.png20 Кб, 128x102
489 2284343
>>84258
Динамические SQL-запросы с кучей параметров это у нас теперь вереница и признаки говнокода, так и запишем.
Буду тогда построчно джойны форматировать через f', а потом конкатенировать через if-elif в единый скрипт, так будет не говнокод))
490 2284347
>>84343
В этом случае это

>'{key1} ... {key2} ... '.format_map(mapping)


ненамного лучше f-strings. Какие же двачеры дегенераты, им дают удобную фичу, а они продолжают кушать говно.
491 2284374
>>84347
Где лучше, ебанат? Скорость себе в очко засунь, толку от твоих десятков милисекунд никакой.
С ф-стрингами мне надо явно указывать название маппинга и обращаться к ключу через ['ключ']. Если потом поменяется название маппинга, мне руками лишний раз ctrl-c + ctrl-v делать? А если набор ключей поменяется, руками лезть и заменять всю эту портянку?
С форматом мне достаточно указывать только ключи и распаковать маппинг. Если поменяется маппинг - поменять маппинг в формате, если поменяется набор ключей - через дикт компрехеншн отфильтровать. Ой забыл, это же всё говнокод, надо всё на ф-стринги переводить, ебаться с конкатенацией, чтоб сэкономить милисекунды на форматировании, но добрать их на конкатенации, зато фичу использую.>>84347
492 2284378
Поясните плис за шаблоны проектирования. Вроде же в питоне уже все встроено чтобы кодить по всем канонам, там уже все шаблоны реализованы же, нет?

Например паттерны - структурные, порождающие и прочее.
А как быть с SOLID, это же про ООП?
И про GRASP это нужно и чем отличается?
493 2284387
>>84374
Да, это говнокод, если тебе уж так необходимо всегда передавать длинный список параметров, то выдели его в структуру или класс, это БАЗА рефакторинга.

>Если потом поменяется название маппинга, мне руками лишний раз ctrl-c + ctrl-v делать?


Решается простейшей глобальной заменой, к тому же, навряд ли у тебя эта переменная будет в одном месте. Но если ты настолько беспомощен, что не может пользоваться ей, то что ты вообще делаешь в программировании?

>если поменяется набор ключей - через дикт компрехеншн отфильтровать


Лол. И разве это не говнокод?
494 2284391
>>84378
Паттерны (или шаблоны) проектирования описывают типичные способы решения часто встречающихся проблем при проектировании программ.

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

В пайтоне уже некоторые паттерны реализованы, да, типа фабрики, декоратора, итератора, но никто не мешает тебе реализовать и другие
495 2284393
>>84387

>выдели его в структуру или класс


У меня это так и работает, распаковка сериализованных данных из MyClass.dict().
По твоей логике мне надо всё засрать 'MyClass.dict()["ключ"]'.

>решается простейшей глобальной заменой


Глобальной заменой чего, класса? У меня разный набор входящих данных сериализуется в отдельных функциях, причем тут вообще глобальная замена?

>Лол. И разве это не говнокод?


Потому что ты так скозал - да.
496 2284412
>>84387
Добавлю к >>84393

>если поменяется набор ключей - через дикт компрехеншн отфильтровать


Вообще я могу это делать на уровне класса, но в том же пайдантике есть параметры типа exclude_unset, так что это пример для чистого дикта.
Очередная экономия на спичках, и лишь бы доебаться со своими фишечками, где они удобны только в простых случаях. Никто это переделывать и переписывать не будет, т.к. всё работает и так и никто на ревью не доёбывался.
497 2284688
>>84412
Запиши это в комментах к коду, чтоб после тебя, когда его будут править другие люди, они видели чем ты руководствовался
498 2284701
Двощ, поясни, как быть. Учусь скраптить странички, пользую селениум. На одном из этапов кликается кнопка:
element = wait.until(
EC.element_to_be_clickable((By.ID, "scroll"))
)
element.click()
После чего начинается новомодный скролл траницы с отрисвокой. Но мне нужно кликнуть на то, что отрисуется после скролла.
Проблема в том, что этот элемент "clickable" сразу, а скролл-то ещё не доехал и этого элемента не видно. Как можно без sleep() заставить движок подождать завершения скрола?
499 2284713
>>84688
Пока мой код дойдёт до рефакторинга пара команд сменится, либо его перепишут на goвно
500 2284723
Анончики, я тут понял, что не очень понимаю конструктивные особенности if-else.
Есть ли какая-то принципиальная разница, если я напишу if - elif - elif - else или if-if-if-if?

https://ideone.com/3vhGMk линкрил.
501 2284724
>>84688
Побежал во всех проектах переделывать формат на ф-строки и отправлять пулл реквесты с комментарием "Руководствовался советами с двача, чтоб сэкономить 20 миллисекунд"
502 2284777
>>84723
Во-первых, страдает читабельность.
Много ифов намекает, что может быть несколько совпадающих условий для одного случая. А иф-елсиф-елс это только один вариант.
Ну и делать инвертированый вариант всех условий для елс это тупо и не всегда возможно.
503 2284780
>>84777

>Много ифов намекает, что может быть несколько совпадающих условий для одного случая. А иф-елсиф-елс это только один вариант.


Справедливо. Оке, понял, спасибо.
504 2284790

>a = '0'*10000


>if len(a) > 0:


> print('Питон говно.')

505 2284797
>>84790
Горелодупый жабий скриптовик, ты?
506 2284906
>>84713
Был проект, предложили переписывать. Говорил, давайте на го сделаем, он быстрее, можно на микросервисы сделать, согласились. А потом звонят и говорят, ну его, давай лучше на джанге, так быстрее чем го осваивать.
ok-javascript-71791218.png25 Кб, 500x666
507 2284912
794245286fea2f21ccd8a0715defadefcf447beed26f6b312edddbbdab0[...].jpg50 Кб, 672x653
508 2284976
у меня жопу сейчас порвало от того что решал задачу на курсе по питону два вечера и код был похож на отрыжку индуса в 16 строк, а в коментах какая-то тяночка скинула частичное лаконичное решение в 5 строчек (коменту несколько лет и потереть его забыли походу), я специально загуглил и она даже нихуя не работает в айти.
А у вас было такое?
509 2285014
>>84976
Покажи задачку хоть, может там ваще хуйня для однострочника.
510 2285019
>>67035
Интерпретатор код читает справа на лево
511 2285057
>>85014
Напишите программу, на вход которой подаётся прямоугольная матрица в виде последовательности строк. После последней строки матрицы идёт строка, содержащая только строку "end" (без кавычек, см. Sample Input).

Программа должна вывести матрицу того же размера, у которой каждый элемент в позиции i, j равен сумме элементов первой матрицы на позициях (i-1, j), (i+1, j), (i, j-1), (i, j+1). У крайних символов соседний элемент находится с противоположной стороны матрицы.

В случае одной строки/столбца элемент сам себе является соседом по соответствующему направлению.
512 2285100
>>85057
https://github.com/Testudinate/Python/blob/master/26_while_matrix.py
Если такие малочитабельные list comprehensions использовать, то почти любой достаточно большой код на Питоне можно сократить в полтора раза. "В пять строчек" твою задачу без них (ну или без itertools или numpy) решить никак нельзя.
Лично я при одинаковой алгоритмической сложности предпочту решение в 16 строк, чем в пять, но подобное.
513 2285109
>>85100

>li, lj = len(m), len(m[0])


Бля, вроде очевидная такая хуйня, а меня на нее осенило только после того как кругами раз 20 по комнате походил, потом еще записал в отдельный текст и сохранил на рабочем столе что

>количество элементов в списке a[0] - это количество столбов, количество вложенных списков в a[] это количество строк.



вроде и интересно такое все решать, а вроде и жепу рвет.
514 2285113
>>85100
>>85109
Ну и вообще спасибо что показал оптимальное и понятное решение.
515 2285114
Анчоусы, у меня есть несколько дат в формате вот в таком формате: 2020-12-13T09:23:25Z
Подскажите, как мне посчитать разницу в минутах между двумя этими датами? Никогда не работал с таким типом данных, вообще хз.
516 2285124
>>85114
Импортируешь в datetime, а там есть функции для разницы.
517 2285140
Как нормально писать код, сил нет.
Пишешь сервер, всё хорошо, всё по полочкам, на своих местах. А потом в какой-то момент это превращается в какую-то мешанину, особенно бизнес логика и условный tasks превращается в какую-то помойку из независимых классов на 2к строк по 10-20 методов, которые вроде как дублируют друг друга, сука, и в то же время нет, потому что отличаются какой-нибудь специфичной залупой.
Трясёт уже от этой херни. Чувствуешь себя конченым дебилом
518 2285143
>>85140
Ещё самое обидное, что некому это ревьюить. Сидишь себе в этой замкнутой бочке и перевариваешься в собственном соку до состояния говна. Ни спросить ни посоветоваться, нихуя. Только на прод выкати завтра, а дальше ебстись как хочешь
519 2285226
>>85143
У меня на ревью кода, я отправл на ревью, был косяк, в словаре закомментил строку и подсунул True для проверки что там будет выводиться при разных данных. Так на ревью апрувнули без вопросов. Сук, как это бесить, хоть блять 1/0 пиши, апрувнут не глядя
56666.PNG2 Кб, 316x49
520 2285246
Кто в vscode работает, как фиксить это дерьмо? Либа кривая или че?
521 2285250
>>85246
Просто редактор не подтягивает методы декоратора, как я понял.
522 2285254
Аноны, мне очень стыдно, но не могу разобраться, как сделать задачу. Суть:
У меня есть список кортежей: [('ask', 421), ('answer', 634), ('answer', 125), ('answer', 285), ('ask', 755), ('ask', 451), ('answer', 935), ('ask', 633)]

Мне нужно профильтровать его так, чтобы у кортежей чередовалось первое значение. Если повторяется значение 'answer', то мне надо выкинуть из списка все кортежи, кроме первого в этом повторении. Если повторяется значение 'ask' - то выкинуть все, кроме последнего в этом повторении. По итогу фильтрации должен остаться такой список:
[('ask', 421), ('answer', 634), ('ask', 451), ('answer', 935), ('ask', 633)]

Первым значением в кортеже всегда бывает либо ask, либо answer, второе значение в кортеже не играет роли (но мне надо соблюсти изначальную сортировку). ask/answer может и не повторяться, а может повторяться 2-5 раз подряд.
524 2285262
Почему воркер gevent пулит очередь с большой задержкой чем prefork? Причём он задерживает ответ, завершает таск, но отправляет ответ брокеру только спустя 10 секунд.

Олимпиадные задачки тут нарасхват вижу, а обсудить подобные проблемы нет. Такое чувство будто в треде одни вкатуны.
16319073777300.webm8,8 Мб, webm,
720x476, 4:43
525 2285263
>>85260
Охуеть, спасибо, анончик! Только как это работает? Вообще не могу понять.
526 2285265
>>85263
groupby нарезает последовательность на группы по ключу, первому элементу тупли в данном случае. Потом по этому же ключу выбираем, какой элемент взять из группы.
527 2285403
Где перекат?
image.png421 Кб, 1210x783
528 2285421
Помогите с задачей пожалуйста, не могу дойти до решения
529 2285473
>>84182
ебаный шизоид
530 2285488
>>85421
Ты где такое взял? Это что-то на динамическое программирование. Да ещё с какой-то начальной эвристикой. Какие хоть ограничения по времени, сложности, памяти?
А ещё подпись про 64 битный ввод намекает, что предлагается решение не на питоне.
531 2285514
>>85488
ограничение по времени 5 секунд, ограничения по памяти нет

>А ещё подпись про 64 битный ввод намекает, что предлагается решение не на питоне.


в питоне же int не ограничен или я ошибаюсь?
532 2285518
>>85514
не ошибаешься.
533 2285521
>>85518
тогда какая проблема с 64 битным вводом? могу ведь считать все в строку а потом в инты уже
535 2285637
>>85421
Упорядочим A по возрастанию. Теперь для заданного x_0 проверить порождает ли x_0 хорошую последовательность можно за O(n) времени, так как можно доказать, что элементы из A оптимально брать в порядке возрастания. Теперь запускаем бинарный поиск для x_0 с границами 1 и M = max(A). Сложность по времени на этом шаге составляет O(n) * O(log M). Для заданных ограничений должно уложиться.
Тред утонул или удален.
Это копия, сохраненная 5 августа 2022 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски