Елена Булыгина предлагает Вам запомнить сайт «Ленусик»
Вы хотите запомнить сайт «Ленусик»?
Да Нет
×
Прогноз погоды

Основная статья: Python

Python в три ручья (часть 2). Блокировки

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

Потоки стремятся к ресурсам, с которыми должны работать. И когда к одному и тому же ресурсу обращается несколько потоков, возникает конфликт. Как его предотвратить?

Потоки нельзя в любой момент напрямую остановить или завершить: на то они и потоки. Но можно на их пути поставить дамбу — блокировку. Она пропустит только один поток, а остальные временно удержит. Так вы исключите конфликт.

Когда поток A выполняет операцию с общими ресурсами, а поток Б не может вмешаться в нее до завершения — говорят, что такая операция атомарна. Залогом потокобезопасности как раз выступает атомарность — непрерывность, неделимость операции.

Простая блокировка в Python

Взаимоисключение (mutual exception, кратко — mutex) — простейшая блокировка, которая на время работы потока с ресурсом закрывает последний от других обращений. Реализуют это с помощью класса Lock.

import threading
mutex = threading.Lock()

Мы создали блокировку с именем mutex, но могли бы назвать её lock или иначе. Теперь её можно ставить и снимать методами .acquire() и .release():

resource = 0

def thread_safe_function():
global resource
    for i in range(1000000):
        mutex.acquire()
        # Делаем что-то с переменной resource
        mutex.release()

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

С блокировками и без. Пример–сравнение

Что происходит, когда два потока бьются за ресурсы, и как при этом сохранить целостность данных? Разберёмся на практике.

Возьмём простейшие операции инкремента и декремента (увеличения и уменьшения числа). В роли общих ресурсов выступят глобальные числовые переменные: назовём их protected_resource и unprotected_resource. К каждой обратятся по два потока: один будет в цикле увеличивать значение с 0 до 50 000, другой — уменьшать до 0. Первую переменную обработаем с блокировками, а вторую — без.

import threading

protected_resource = 0
unprotected_resource = 0

NUM = 50000
mutex = threading.Lock()

# Потокобезопасный инкремент
def safe_plus():
    global protected_resource
    for i in range(NUM):
        # Ставим блокировку
        mutex.acquire()
        protected_resource += 1
        mutex.release()

# Потокобезопасный декремент
def safe_minus():
    global protected_resource
    for i in range(NUM):
        mutex.acquire()
        protected_resource -= 1
        mutex.release()

# То же, но без блокировки
def risky_plus():
    global unprotected_resource
    for i in range(NUM):
        unprotected_resource += 1

def risky_minus():
    global unprotected_resource
    for i in range(NUM):
        unprotected_resource -= 1

В названия потокобезопасных функций мы поставили префикс safe_, а небезопасных — risky_.

Создадим 4 потока, которые будут выполнять функции с блокировками и без:

thread1 = threading.Thread(target = safe_plus)
thread2 = threading.Thread(target = safe_minus)
thread3 = threading.Thread(target = risky_plus)
thread4 = threading.Thread(target = risky_minus)
thread1.start()
thread2.start()
thread3.start()
thread4.start()
thread1.join()
thread2.join()
thread3.join()
thread4.join()
print ("Результат при работе с блокировкой %s" % protected_resource)
print ("Результат без блокировки %s" % unprotected_resource)

Запускаем код несколько раз подряд и видим, что полученное без блокировки значение меняется случайным образом. При использовании блокировки всё работает последовательно: сначала значение растёт, затем — уменьшается, и в итоге получаем 0. А потоки thread3 и thread4 работают без блокировки и наперебой обращаются к глобальной переменной. Каждый выполняет столько операций своего цикла, сколько успевает за время активности. Поэтому при каждом запуске получаем случайные числа.

Как избежать взаимных блокировок?

Следите, чтобы у нескольких блокировок не было шанса сработать одновременно. Иначе одна заглушка перекроет один поток, другая — другой, и может случиться взаимная блокировка — тупик (deadlock). Это ситуация, когда ни один поток не имеет права действовать и программа зависает или рушится.

Если есть «захват» мьютекса, ничто не должно помешать последующему «высвобождению». Это значит, что release() должен срабатывать, как только блокировка становится не нужна.

Пишите код так, чтобы блокировки снимались, даже если функция выбрасывает исключение и завершает работу нештатно. Подстраховаться можно с помощью конструкции try-except-finally:

try:
    mutex.acquire()
    # Ваш код...

except SomethingGoesWrong:
    # Обрабатываем исключения

finally:
    # Ещё код
    mutex.release()

Другие инструменты синхронизации в Python

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

Семафоры (Semaphore)

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

Значение счётчика уменьшается с каждым новым вызовом acquire(), то есть с подключением к ресурсу новых потоков. Когда ресурс высвобождается, значение возрастает. При нулевом значении счётчика работа потока останавливается, пока другой поток не вызовет метод release(). По умолчанию значение счётчика равно 1.

s = Semaphore(5)
# В скобках при необходимости указывают стартовое значение счётчика

Можно создать «ограниченный семафор» конструктором BoundedSemaphore().

События (Event)

Событие — сигнал от одного потока другим. Если событие возникло — ставят флаг методом .set(), а после обработки события — снимают с помощью .clear(). Пока флага нет, ресурс заблокирован. Ждать события могут один или несколько потоков. Важную роль играет wait(): если флаг установлен, этот метод спокойно отдаёт управление ресурсом; если нет — блокирует его на заданное время или до установки флага одним из потоков.

e = threading.Event()

def event_manager():
    # Ждём, когда кто-нибудь захватит флаг
    e.wait()
    ...
    # Ставим флаг
    e.set()

    # Работаем с ресурсом
        ...
   # Снимаем флаг и ждём нового
   e.clear()

Если нужно задать время ожидания, его пишут в секундах, в виде числа с плавающей запятой. Например: e.wait(3,0).

Метод is_set() проверяет, активно ли событие. Важно следить, чтобы события попадали в поле зрения потоков-потребителей сразу после появления. Иначе работа зависящих от события потоков нарушится.

Рекурсивная блокировка (RLock)

Такая блокировка позволяет одному потоку захватывать ресурс несколько раз, но блокирует все остальные потоки. Это полезно, когда вы используете вложенные функции, каждая из которых тоже применяет блокировку. Число вложенных .acquire() и .release() не даст интерпретатору запутаться, сколько раз поток имеет право захватывать ресурс, а когда блокировку надо снять полностью. Механизм основан на классе RLock:

import threading, random

counter = 0
re_mutex = threading.RLock()

def step_one():
    global counter
    re_mutex.acquire()
    counter = random.randint(1,100)
    print("Random number %s" % counter)
    re_mutex.release()

def step_two():
    global counter
    re_mutex.acquire()
    counter *= 2
    print("Doubled = %s" % counter)
    re_mutex.release()
   
def walkthrough():
    re_mutex.acquire()
    try:
        step_one()
        step_two()
    finally:
        re_mutex.release()

t = threading.Thread(target = walkthrough)
t2 = threading.Thread(target = walkthrough)

t.start()
t2.start()
t.join()
t2.join()

Запустите это и проверьте результат: арифметика должна быть верна.

Теперь попробуйте убрать блокировку внутри walkthrough:

def walkthrough():
        step_one()
        step_two()

Ещё раз запустите код — порядок действий нарушится. Программа умножит на 2 только второе случайное число, а затем удвоит полученное произведение.

Переменные состояния (Condition)

Переменная состояния — усложнённый вариант события (Event). Через Condition на ресурс ставят блокировку нужного типа, и она работает, пока не произойдёт ожидаемое потоками изменение. Как только это случается, один или несколько потоков разблокируются. Оповестить потоки о событии можно методами:

  • notify() — для одного потока;
  • notifyAll() — для всех ожидающих потоков.

Это выглядит так:

# Создаём рекурсивную блокировку
mutex = threading.RLock()

# Создаём переменную состояния и связываем с блокировкой
cond = threading.Condition(mutex)

# Поток-потребитель ждёт свободного ресурса и захватывает его
def consumer():
    while True:
            cond.acquire()
            while not resourse_free():
            cond.wait()
            get_free_resource()
            cond.release()

# Поток-производитель разблокирует ресурс и уведомляет об этом потребителя
def producer():
    while True:
            cond.acquire()
            unblock_resource()
            # Сигналим потоку: "Налетай на новые данные!"
            cond.notify()
            cond.release()

Чтобы выставить больше одного условия разблокировки, можно увязать доступ к ресурсу с несколькими переменными состояния.

cond = threading.Condition(mutex)
another_cond = threading.Condition(mutex)

Компактные блокировки с with

При множестве участков с блокировками каждый раз прописывать «захват» и «высвобождение» утомительно. Сократить код поможет конструкция с оператором with. Она использует менеджер контекста, который позволяет сначала подготовить приложение к выполнению фрагмента кода, а затем гарантированно освободить задействованные ресурсы.

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

  • «Предисловие» — метод __enter__(). Здесь можно ставить блокировку и  прописывать другие настройки;

  • «Послесловие» — метод __exit__(). Он срабатывает, когда все инструкции выполнены или работа блока прервана. Здесь можно снять блокировку и/или предусмотреть реакцию на исключения, которые могут быть выброшены.

Удача! У нашего целевого класса Lock эти два метода уже прописаны. Поэтому любой экземпляр объекта Lock можно использовать с with без дополнительных настроек.

Отредактируем функцию из примера с инкрементом. Поставим блокировку, которая сама снимется, как только управляющий поток выйдет за пределы with-блока:

def safe_plus():
    global protected_resource
    for i in range(NUM):
        with mutex:
 protected_resource += 1

# И никаких acquire-release!
Пройти обучение

8 июн 18, 21:33
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Полезные навыки, которые можно освоить за 30 дней 

Начать изучать языки программирования, например Python

Книги для старта:

Allen Downey — Think Python: How to Think Like a Computer Scientist

Пособие поэтапно знакомит новичков с азами языка. Большие темы для облегчения знакомства разбиты на небольшие этапы. 

Zead Show — Learn Python the Hard Way

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

Марк Лутц — Изучаем Python

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

Для забавной практики рекомендуем пройти образовательную игру Python Challenge 

Повысить мастерство игры в Го 

Го считается сложнейшей игрой в мире. В XVI веке император Японии даже издал декрет, обязывающий государственных чиновников играть в го. 

Го — это игра в основание царства. Стратегия здесь — превыше всего, а тактические приемы постоянно приходится переосмысливать и корректировать. 

В го играют на доске 19 х 19 линий. Противники по очереди выставляют камни на перекрестья линий или пасуют. Цель игры — отгородить себе как можно больше свободных перекрестков. У каждого игрока достаточно камней, чтобы заполнить доску. 

Изучайте приёмы с помощью серии статей в одном из самых читаемых журналов СССР «Наука и жизнь» 1975-1976гг., после которой началось массовое развитие игры Го в России.

Выучить Азбуку Морзе

Код Морзе можно быстро передать с помощью телеграфа, а также он очень удобен для передачи сигнала бедствия (сигнала СОС) с помощью радио, зеркала или фонаря. С помощью Азбуки можно тренировать память, слух и шифровать свои сообщения. 

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

Соотнесите то, что вы услышали с буквами алфавита.

Для соотношения и расшифровки используйте вариант Азбуки, который включает в себя пунктуационные знаки, аббревиатуры, устойчивые выражения и коды

Привить себе любовь к музыке

Известно, что занятия музыкой позитивно влияют на правое полушарие, ответственное за творческое начало. 

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

При должном старании можно сыграть Имперский марш даже на ложечке для кофе. Есть пруф!

Спорт 

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

Заметим, что 30 дней хватит на то, чтобы организовать себе планка-challenge. 

Планка — упражнение с собственным весом. 

Не требует ничего, кроме вас и желания. При этом, укрепляются спина, руки, пресс, бёдра и ягодицы. 

Вот как правильно встать в планку: 

  • Ложитесь на живот на пол.
  • Подтяните руки к груди, упритесь мысками в пол.
  • Выпрямите руки, подняв тело над полом. Ладони прямо под плечами, таз не провисает и не поднимается вверх.
  • Ягодицы подтянуты, живот втянут. Макушкой тянитесь вверх, вытягивая шею, а плечи тяните вниз. Колени держите прямыми. Пятки не соприкасаются.

Если вы только начинаете заниматься, 30 секунд планки будет достаточно.

В первый день сделайте четыре подхода по 30 секунд и каждый старайтесь добавлять по несколько секунд к подходу. Записывайте успехи и гордитесь собой.


Конечно, месяц — небольшой срок для достижения уровня «бог», но можно попробовать. 

Ведь согласно одному из направлений психологии — для формирования привычки необходим 21 день :)  

Пройти обучение

18 май 18, 19:16
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

История языков программирования: 1990-е

Последнее десятилетие XX века ознаменовалось появлением интернета (World Wide Web) в его привычном глобальном виде. Если ранее языки и идеи программирования распространялись через отдельные дистрибутивы или журналы, то теперь появился мощный канал обмена информацией, доступный каждому. Таким образом, любой язык программирования, даже созданный школьником на уголке планеты, мог стать международным хитом.

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

Перерождение функционального программирования

Функциональные языки программирования появились ещё на рассвете программирования: в конце 50-х был Lisp, который получил международное признание и долгое время являлся одним из китов программирования. Однако с тех пор, как появились Basic и Pascal, общественный интерес к функциональному программированию угас – их возможностей хватало на решение подавляющего большинства задач персонального компьютера. Но рост требований и появление интернета изменило требования и интерес к ФП вспыхнул с новой силой. Это стало катализатором появления и популяризации языков Erlang (1986) и Haskell (1990) – чистых языков функционального программирования. Это означает:

  • Отсутствие побочных эффектов использования памяти и ввода-вывода информации. Проще говоря, при изменении частных не меняется структура программы и объекты. Например, в Haskell для этого используется механизм монад.
  • Использование функций высших порядков и лямбда-абстракций. Функции могут быть аргументами и возвращаться в качестве результата вычисления.
  • Активное использование рекурсий. В то время, как в императивном программировании в основе лежат циклы в классическом представлении, в функциональном без умения использовать рекурсию делать нечего.

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

Проще, мощнее, универсальнее

В мире программирования всегда находятся гики, которые стараются упростить и усовершенствовать популярные языки. Лучшие из них меняют ход истории. Так, к примеру, произошло с Гвидо Ван Россумом, создателем языка Python.

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

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

Ещё одно подтверждение этому – появление в 1991 году очередной ветви популярного языка – Visual Basic. VB был направлен на работу с графическим интерфейсом Microsoft Windows. «Оконная» ОС уже тогда была одним из лидеров рынка, и за возможность создавать приложения зацепилось огромное количество простых пользователей. Несмотря на то, что первые версии VB не отличались функциональностью и качеством сборки, язык получил большую популярность.

Развитие получил и Pascal. Именно в середине 1990-х появился Delphi, он же Object Pascal. В отличии от Visual Basic он стал не следствием не ответвления, а эволюции Turbo Pascal. Популяризации языка поспособствовала и компания Borland, подхватившая новый язык и создав на его основе программную среду, которая как раз и называлась Delphi. С её помощью миллионы школьников по всему миру научились создавать собственные MVC-приложения: игры, органайзеры, медиаплееры – всё то, о чём несколько лет назад и мечтать было сложно.

Начало доминирования

Пожалуй, главный вклад 1990-х в современный мир состоит в появлении двух невероятно мощных и схожих языков – Java и C#. Java появился хронологически раньше. Язык стремился решить насущную проблему – создание такого кода, который бы мог работать на любой платформе. Реализация стала возможна благодаря трансляции в байт-код с использованием виртуальной машины. Идея не нова, она использовалась на машине Atlas в Кэмбридже ещё в 1960-х, но только сейчас она стала по-настоящему актуальной. Синтаксис Java был схож с популярными языками, в том числе C++, но функциональность была расширена до полноценных возможностей ООП.

Концепция Java очень быстро нашла отклик у программистов, и к концу века каждый четвертый программист на планете был знаком с этим языком. Конечно, такая популярность не могла пройти мимо внимания самой могущественной IT-компании – Microsoft. На базе Java, учтя все претензии и пожелания, они выпустили свой язык – С#. Такой же популярности язык не достиг, но возможность кастомизировать Windows, на тот момент уже одной из популярнейших ОС, привлекла внимание огромного числа программистов.

Это стало причиной негласной вражды и развития программных платформ для обоих языков. Правда, всё это будет в 2000-х, а в 1990-е появляется новое направление – языки веба.

Создание интернета

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

Существующие языки программирования для веба были слишком «тяжёлыми», всё-таки скорость соединений в начале 90-х оставляла желать лучшего. Поэтому в качестве стандарта WWW выступала технология гипертекста. Базовым языком стал HTML, разработка которого велась ещё с 1986 года. Несмотря на то, что он не является Тьюринг-полным, то есть не может быть причислен к разряду языков программирования, переоценить вклад HTML в современный IT-мир трудно.

К середине десятилетия выросло количество серверов, сайтов, соответственно, увеличился объем трафика. Для того, чтобы уменьшить количество кода и привести страницы к общему логическому знаменателю, веб-разработчики стали использовать язык CSS. С его помощью можно было задавать цвета, формат шрифта, верстать страницы и логически их разделять, используя единый шаблон для всего сайта. Это не только уменьшило количество кода, но и значительно повысило надёжность.

Альтернативой специализированным языкам являлся Perl – язык общего назначения для работы с текстом. Он заимствовал синтаксис и механизмы из других популярных языков, в том числе С и awk, но благодаря ориентации никогда не был им конкурентом. Когда речь зашла о поиске подходящего инструмента для интерфейсного обслуживания интернета, Perl стал одним из главных вариантов.

Он же лёг в основу истории создания важнейшего языка современной «паутины» –  PHP. Именно Perl использовал Расмус Лердорф, программист из Дании, создавая скрипты для обработки статистики онлайн-резюме. Он дал им название Personal Home Page. Позднее Расмус понял, что возможностей Perl ему не хватает, разработал на С новый интерпретатор шаблонов, который и получил название PHP.

Однако большая слава к языку пришла лишь после того, как в 1997 году Энди Гутманс и Зеев Сураски значительно переработали PHP, подняв к нему интерес и придав современный облик. С этого времени популярность языка начала стремительно расти, пока PHP не утвердился в качестве одного из главных языков программирования.

Еще одной альтернативной ветвью развития Perl стал Ruby – динамический высокоуровневый язык с полноценной реализацией ООП. Юкихиро Мацумото хотел реализовать ту же идею доступности, что существовала в Python, при этом сохранив «дух» Smalltalk и Perl.

Но, пожалуй, главную революцию совершил язык JavaScript. Он также изначально замышлялся, как скриптовая замена С для обработки макросов. Но, благодаря многочисленным стечениям обстоятельств и удачной интеграции в HTML-коды, JavaScript вызвал бурный интерес у большинства разработчиков. Конец 90-х и начало 2000-х в вебе запомнились огромным количеством веб-страниц, перенасыщенных JS-скриптами. Они сверкали всеми цветами радуги, выдавали всплывающие сообщения при каждом клике, картинки перемещались по экрану. Сейчас это кажется ужасом, но тогда это стало настоящей революцией. Именно так JavaScript стал обязательным инструментом веб-разработчика и сохраняет это звание по сей день.

На пороге очередной технологической революции

В 1990-х стал зарождаться еще один мощный рынок – гибридов телефона и компьютера. Термин «смартфон» введет компания Ericsson только в 2000-х году, пока они носят название коммуникаторы. Изначально приложения разрабатываются на языках ассемблера и С, а системы имеют закрытый характер. Однако к концу тысячелетия ситуация меняется – Psion, Nokia, Ericsson и Motorola создают консорциум Symbian. Выпущенная им операционная система вскоре захватит почти весь рынок,  став отправной точкой в сфере пользовательской разработки мобильных приложений.

Впрочем, об этом мы уже поговорим в следующем десятилетии.

Пройти обучение

17 май 18, 16:47
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Python в три ручья: работаем с потоками (часть 1)

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

Небольшое предупреждение для тех, кто впервые слышит о параллельных вычислениях. Что такое поток и чем он отличается от процесса, мы выяснили в статье «Внутри процесса: многопоточность и пинг-понг mutex'ом». Тогда мы приводили примеры на Java, но теоретические основы многопоточности верны и для Python. Совпадают, в том числе, механизмы синхронизации потоков: семафоры, взаимные исключения (mutex), условия, события. Поэтому сегодня сделаем акцент на особенностях Python, его механизмах и инструментах, связанных с многопоточностью.

Организовать параллельные вычисления в Python без внешних библиотек можно с помощью модулей:

  • threading — для управления потоками.
  • queue —  для организации очередей.
  • multiprocessing  — для управления процессами.

Пока нас интересует только первый пункт списка.

Как создавать потоки в Python

Метод 1  — «функциональный»

Для работы с потоками из модуля threading импортируем класс Thread. В начале кода пишем:

from threading import thread

После этого нам будет доступна функция Thread()  — с ней легко создавать потоки. Синтаксис такой:

variable = Thread(target=function_name, args=(arg1, arg2,))

Первый параметр target — это «целевая» функция, которая определяет поведение потока и создаётся заранее. Следом идёт список аргументов. Если судьбу аргументов (например, кто будет делимым, а кто делителем в уравнении) определяет их позиция, их записывают как args=(x,y.). Если же вам нужны аргументы в виде пар «ключ-значение», используйте запись вида kwargs={‘prop’:120}.

Ради удобства отладки можно также дать новому потоку имя. Для этого среди параметров функции прописывают name=«Имя потока». По умолчанию name хранит значение null. А ещё потоки можно группировать с помощью параметра group, который по умолчанию — None.

За дело! Пусть два потока параллельно выводят каждый в свой файл заданное число строк. Для начала нам понадобится функция, которая выполнит задуманный нами сценарий. Аргументами целевой функции будут число строк и имя текстового файла для записи.

Давайте попробуем:

#coding: UTF-8
from threading import Thread

def prescript(thefile, num):
    with open(thefile, 'w') as f:
        for i in range(num):
            if num > 500:
                f.write('МногоБукв\n')
            else:
                f.write('МалоБукв\n')

thread1 = Thread(target=prescript, args=('f1.txt', 200,))
thread2 = Thread(target=prescript, args=('f2.txt', 1000,))

thread1.start()
thread2.start()
thread1.join()
thread2.join()

Что start() запускает ранее созданный поток, вы уже догадались. Метод join() останавливает поток, когда тот выполнит свои задачи. Ведь нужно закрыть открытые файлы и освободить занятые ресурсы. Это называется «Уходя, гасите свет». Завершать потоки в предсказуемый момент и явно  — надёжнее, чем снаружи и неизвестно когда. Меньше риск, что вмешаются случайные факторы. В качестве параметра в скобках можно указать, на сколько секунд блокировать поток перед продолжением его работы.

Метод 2  — «классовый»

Для потока со сложным поведением обычно пишут отдельный класс, который наследуют от Thread из модуля threading. В этом случае программу действий потока прописывают в методе run() созданного класса. Ту же петрушку мы видели и в Java.

#coding: UTF-8

import threading
class MyThread(threading.Thread):
    def __init__(self, num):
        super().__init__(self, name="threddy" + num)
        self.num = num
    def run(self):
        print ("Thread ", self.num),
thread1 = MyThread("1")
thread2 = MyThread("2")
thread1.start()
thread2.start()
thread1.join()
thread2.join()

Стандартные методы работы с потоками

Чтобы управлять потоками, нужно следить, как они себя ведут. И для этого в threading есть специальные методы:

current_thread()  — смотрим, какой поток вызвал функцию;

active_count() — считаем работающие в данный момент экземпляры класса Thread;

enumerate()   — получаем список работающих потоков.

Ещё можно управлять потоком через методы класса:

is_alive()  —  спрашиваем поток: «Жив ещё, курилка?»  — получаем true или false;

getName()  — узнаём имя потока;

setName(any_name)  — даём потоку имя;

У каждого потока, пока он работает, есть уникальный идентификационный номер, который хранится в переменной ident.

thread1.start()
print(thread1.ident)

Отсрочить операции в вызываемых потоком функциях можно с помощью таймера. В инициализаторе объектов класса Timer всего два аргумента — время ожидания в секундах и функция, которую нужно в итоге выполнить:

import threading
print ("Waiting...")
def timer_test():
    print ("The timer has done its job!")
tim = threading.Timer(5.0, timer_test)
tim.start()

Таймер можно один раз создать, а затем запускать в разных частях кода.

Потусторонние потоки

Обычно Python-приложение не завершается, пока работает хоть один его поток. Но есть особые потоки, которые не мешают закрытию программы и останавливается вместе с ней. Их называют демонами (daemons). Проверить, является ли поток демоном, можно методом isDaemon(). Если является, метод вернёт истину.

Назначить поток демоном можно  при создании — через параметр “daemon=True” или аргумент в инициализаторе класса.

thread0 = Thread(target=target_func, kwargs={‘x’:10}, daemon=True)

Не поздно демонизировать и уже существующий поток методом setDaemon(daemonic).

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

Приключение начинается. У древнего шлюза

Питон слывёт дружелюбным и простым в общении, но есть у него причуды. Нельзя просто взять и воспользоваться всеми преимуществами многопоточности в Python! Дорогу вам преградит огромный шлюз… Даже так — глобальный шлюз (Global Interpreter Lock, он же GIL), который ограничивает многопоточность на уровне интерпретатора. Технически, это один на всех mutex, созданный по умолчанию. Такого нет ни в C, ни в Java.

Задача шлюза  — пропускать потоки строго по одному, чтоб не летали наперегонки, как печально известные стритрейсеры, и не создавали угрозу работе интерпретатора.

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

Дезориентированный спросонок поток, который видит перед собой совсем не ту ситуацию, при которой засыпал, рискует разбиться и повалить интерпретатор, либо попасть в тупиковую ситуацию (deadlock). Например, перед сном Поток 1 начал работу со списком, а после пробуждения не нашёл в этом списке элементов, т.к. их удалил или перезаписал Поток 2.

Чтобы такого не было, GIL в предсказуемый момент (по умолчанию раз в 5 миллисекунд для Python 3.2+) командует отработавшему потоку: «СПАААТЬ!»  — тот отключается и не мешает проезжать следующему желающему. Даже если желающего нет, блокировщик всё равно подождёт, прежде чем вернуться к предыдущему активному потоку.

Благодаря шлюзу однопоточные приложения работают быстро, а потоки не конфликтуют. Но, к сожалению, многопоточные программы при таком подходе выполняются медленнее  — слишком много времени уходит на регулировку «дорожного движения». А значит обработка графики, расчет математических моделей и поиск по большим массивам данных c GIL идут неприемлемо долго.

В статье «Understanding Python GIL»технический директор компании Gaglers Inc. и разработчик со стажем Chetan Giridhar приводит такой пример:

from datetime import datetime
import threading
def factorial(number): 
    fact = 1
    for n in range(1, number+1): 
        fact *= n 
    return fact 
number = 100000 
thread = threading.Thread(target=factorial, args=(number,)) 
startTime = datetime.now() 
thread.start() 
thread.join()

endTime = datetime.now() 
print "Время выполнения: ", endTime - startTime

Код вычисляет факториал числа 100 000 и показывает, сколько времени ушло у машины на эту задачу. При тестировании на одном ядре и с одним потоком вычисления заняли 3,4 секунды. Тогда Четан создал и запустил второй поток. Расчет факториала на двух ядрах длился 6,2 секунды. А ведь по логике скорость вычислений не должна была существенно измениться! Повторите этот эксперимент на своей машине и посмотрите, насколько медленнее будет решена задача, если вы добавите thread2. Я получила замедление ровно вдвое.

Глобальный шлюз  — наследие времён, когда программисты боролись за достойную реализацию многозадачности и у них не очень получалось. Но зачем он сегодня, когда есть много- и очень многоядерные процессоры? Как объяснил Гвидо ван Россум, без GIL не будут нормально работать C-расширения для Python. Ещё упадёт производительность однопоточных приложений: Python 3 станет медленнее, чем Python 2, а это никому не нужно.

Что делать?

«Нормальные герои всегда идут в обход»

Шлюз можно временно отключить. Для этого интерпретатор Python нужно отвлечь вызовом функции из внешней библиотеки или обращением к операционной системе. Например, шлюз выключится на время сохранения или открытия файла. Помните наш пример с записью строк в файлы? Как только вызванная функция возвратит управление коду Python или интерфейсу Python C API, GIL снова включается.

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

Если вы собираетесь использовать Python для сложных научных расчётов, обойти скоростную проблему GIL помогут библиотеки Numba, NumPy, SciPy и др. Опишу некоторые  из них в двух словах, чтобы вы поняли, стоит ли разведывать это направление дальше.

Numba  для математики

Numba — динамически, «на лету» компилирует Python-код, превращая его в машинный код для исполнения на CPU и GPU. Такая технология компиляции называется JIT — “Just in time”. Она помогает оптимизировать производительность программ за счет ускорения работы циклов и компиляции функций при первом запуске.

Суть в том, что вы ставите аннотации (декораторы) в узких местах кода, где вам нужно ускорить работу функций.

Для математических расчётов библиотеку удобно использовать в связке c NumPy.  Допустим, нужно сложить одномерные массивы — элемент за элементом.

def arr_sum (x , y): 
    result_arr = nupmy.empty_like ( x)
    for i in range (len (x)) : 
    result_arr [i ] = x[i ] + y[i ] 
    return result_arr

Метод nupmy.empty_like() принимает массив и возвращает (но не инициализирует!) другой  — соответствующий исходному по форме и типу. Чтобы ускорить выполнение кода, импортируем класс jit из модуля numba и добавляем в начало кода аннотацию @jit:

from numba import jit
@jit
def arr_sum(x,y):

Это скромное дополнение способно ускорить выполнение операции более чем в 100 раз! Если интересно, посмотрите замеры скорости математических расчётов при использовании разных библиотек для Python.

PyCUDA и Numba для графики

В графических вычислениях Numba тоже кое-что может. Она умеет работать с программной моделью CUDA, чтобы визуализировать научные данные и работу алгоритмов, выдавать информацию о GPU и др. Подробнее о том, как работают графический процессор и CUDA  — здесь. И снова мы встретимся с многопоточностью.

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

from numba import cuda
@cuda.jit
def call_for_kernel(io_arr):
    # Идентификатор потока в одномерном блоке
    thread_x = cuda.threadIdx.x
    # Идентификатор блока в одномерной сетке
    thread_y = cuda.blockIdx.x
    # Число потоков на блок (т.е. ширина блока)
    block_width = cuda.blockDim.x
    # Находим положение в массиве
    t_position = thread_x + thread_y * block_width
    if  t_position < io_arr.size:  # Убеждаемся, что не вышли за границы массива
        io_arr[ t_position] *= 2 # Считаем

Главный плюс этого кода даже не в скорости исполнения, а в прозрачности и простоте. Снова сошлюсь на Хабр, где есть сравнение скорости GPU-расчетов при использовании Numba, PyCUDA и эталонного С CUDA. Небольшой спойлер: PyCUDA позволяет достичь скорости вычислений, сопоставимой с Cи, а Numba подходит для небольших задач.

Когда многопоточность в Python оправдана

Стоит ли преодолевать связанные c GIL сложности и тратить время на реализацию многопоточности? Вот примеры ситуаций, когда многопоточность несёт с собой больше плюсов, чем минусов.

  • Для длительных и несвязанных друг с другом операций ввода-вывода. Например, нужно обрабатывать ворох разрозненных запросов с большой задержкой на ожидание. В режиме «живой очереди» это долго  — лучше распараллелить задачу.
  • Вычисления занимают более миллисекунды и вы хотите сэкономить время за счёт их параллельного выполнения. Если операции укладываются в 1 мс, многопоточность не оправдает себя из-за высоких накладных расходов.
  • Число потоков не превышает количество ядер. В противном случае параллельной работы всех потоков не получается и мы больше теряем, чем выигрываем.

Когда лучше с одним потоком

  • При взаимозависимых вычислениях. Считать что-то в одном потоке и передавать для дальнейшей обработки второму — плохая идея. Возникает лишняя зависимость, которая приводит к снижению производительности, а в случае ошибки  — к ступору и краху программы.
  • При работе через GIL. Это мы уже выяснили выше.
  • Когда важна хорошая переносимость на разных устройствах. Правильно подобрать число потоков для машины пользователя  — задача не из легких. Если вы пишете под известное вам «железо», всё можно решить тестированием. Если же нет  — понадобится дополнительно создавать гибкую систему подстройки под аппаратную часть, что потребует времени и умения.

Анонс — взаимные блокировки в Python

Самое смешное, что по умолчанию GIL защищает только интерпретатор и не предохраняет наш код от взаимных блокировок (deadlock) и других логических ошибок синхронизации. Поэтому разводить потоки по углам, как и в Java, нужно  принудительно — с помощью блокирующих механизмов. Об этом и о не упомянутых в статье компонентах модуля threading мы поговорим в следующий раз.

Пройти обучение

4 май 18, 17:21
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Как Королев, Армстронг и Маск принесли космос в культуру

Человек давно стремится раскрыть тайны Вселенной. Эта цель стала не только мощным двигателем технологического прогресса, но и определила целый пласт культуры. За десятилетия космических исканий в ней сформировались почти археологические слои. В День космонавтики предлагаем «раскопать» их: вспомним историю освоения космоса и то, как она отразилась в культовых книгах, кинолентах, видеоиграх и музыкальных треках, под которые хорошо мечтается о звездах.

До 12.04.1961

Мечты людей о покорении космоса находили отклик в культуре и искусстве еще до легендарного гагаринского полета. Одно из первых произведений в этом ключе – роман Герберта Уэллса «Война миров», написанный в 1897 году. Впервые в литературе прозвучала тема инопланетного вторжения и вражды между людьми и пришельцами.

В советской фантастике первооткрывателем космической тематики становится ученый Константин Циолковский: его повесть «Вне Земли» была опубликована в 1918 году. Вершина отечественной космической фантастики 1920 годов – роман «Аэлита» Алексея Толстого. Он повествует о путешествии землян на Марс в поисках нового общества.

В 1940-е годы на Западе колоссальную популярность приобрела «космическая опера» – отдельное течение приключенческой научной фантастики. И пока ученые снаряжали ракету V-2 с плодовыми мушками, чтобы 20 февраля 1947 отправить в космос первую жизнь, –  писатели, режиссеры и журналисты тоже не теряли времени:

  • Эдмонд Гамильтон прославился своими романами о масштабных космических катастрофах, за которые его прозвали и Разрушителем, и Спасителем миров;
  • Журнал "Astounding" растиражировал космические вестерны, ставшие фирменным жанром издания;
  • Газеты пестрели комиксами о Флэше Гордоне и Баке Роджерсе, а на их основе сняли киносериалы.

На этом поп-фоне выделялась концептуальная научная фантастика, легендарной сагой которой стал цикл из семи романов Айзека Азимова – «Основание». В 1966 году оригинальная трилогия удостоилась специальной премии "Hugo" за «лучшую фантастическую серию всех времен».

«Заря», я «Кедр». Поехали!

Под этими позывными общались Сергей Королев и Юрий Гагарин во время легендарного полета на корабле «Восток-1» 12 апреля 1961 года. Тогда человек впервые покорил космическое пространство, и астронавтика захватила умы с новой силой. Прибавьте к этому первый в мире групповой полет 12 августа 1962 года, женский дебют в космосе Валентины Терешковой в 1963-ем, и, год спустя, выход Алексея Леонова из корабля за пределами земной атмосферы – и сможете представить, насколько в 60-е земляне устремились к Вселенной.

В 1961 году на экраны вышел один из первых советских фантастических фильмов о космическом путешествии – «Планета бурь». В картине были применены уникальные технологии комбинированной съемки, в том числе подводной. Они намного опережали зарубежные аналоги.

11 марта 1964 года Джин Родденберри представил короткую первую версию научно-фантастического телевизионного сериала "Star Trek". 8 сентября 1966 года вышла пилотная серия, а сам "Star Trek" стал культовым и до сих пор продолжает свое шествие по экранам – уже в виде франшизы.

Волновала умы зрителей и «Барбарелла» 1968 года. Из рекламной аннотации тех времен становится ясно, почему: «Искательница сексуальных приключений Барбарелла путешествует по Вселенной. Она встречается с представителями рас и цивилизаций самой разнообразной внешности и несет им любовь». Мотивация к покорению космоса достигла пика – земляне рисовали в фантазиях встречу со свободной от предрассудков Барбареллой…

Вехой в развитии кинофантастики стала «Космическая одиссея 2001 года» (1968), снятая Стэнли Кубриком. В честь этой книги и фильма НАСА назвала орбитальный аппарат Mars: "2001 Mars Odyssey".

Одним из лучших фильмов 60-х стала «Планета обезьян» (1968), снятая по одноименному роману Пьера Буля (1963). Лента рассказывает о космическом корабле, отправленном с Земли к ближайшей звезде, и о высадке на планете со странными «животными». Кинокартина породила несколько сиквелов, два телесериала, один ремейк и недавний перезапуск, вышедший под названием «Восстание планеты обезьян».

Революцию в музыке произвели Pink Floyd. С первых же альбомов команда смело экспериментировала. Музыканты не просто писали песни о космосе с названиями вроде "Interstellar Overdrive" и "Set the Controls for the Heart of the Sun", но и стремились к новому, футуристическому звучанию.

Шаг, определивший эпоху

В 1969 году Нил Армстронг ступил на Луну и открыл новые возможности для человека в космосе. Надежда открыть новый мир и почувствовать под ногами неземную твердь обрела реальные очертания.

В 1971 году Майк Мэйфилд написал текстовую игру "Star Trek" на BASIC. А видеоигра "Space Invaders" (1978) была признана лучшей аркадной игрой по версии Книги рекордов Гиннесса.

На экраны в этот период вышли легендарные киноленты, сериалы и мультфильмы:

  • «Москва – Кассиопея» –  СССР, 1973;
  • «Большое космическое путешествие» –  СССР, 1975;
  • «Звездные войны IV» – США, 1977;
  • «Через тернии к звездам» –  СССР, 1980;
  • «Путеводитель по Галактике для автостопщиков» –  Великобритания, 1981;
  • «Тайна третьей планеты» –  СССР, 1981.

В музыке тоже царит очарование космосом:

  • David Bowie – Space Oddity (1969);
  • The Beatles – Across The Universe (1970);
  • Elton John – Rocket Man (1972);
  • «Надежда» (1971) – песня, написанная Александрой Пахмутовой и Николаем Добронравовым, стала музыкальным талисманом советских и российских космонавтов.

В 1977 на танцплощадках Парижа появились Space – странные люди, одетые в скафандры с глухими забралами. Они делали упор на «неземные» звуки синтезатора и научно-фантастическое шоу.

Мода откликнулась на космические полеты футуристическим стилем: Андрэ Куррэж и Пако Рабанн, металл и пластик, облегающие комбинезоны и высокие сапоги на плоской подошве… Даже маленькие дамские шляпки напоминали летные шлемы. Советские модницы носили тоже носили «неземные» аксессуары: вот и у мамы Дениски из знаменитых рассказов Драгунского была шляпка, похожая «на космонавтский шлем».

Гости или захватчики?

Позже космическая романтика пошла на спад, и на смену вдохновенному освоению планет пришло ожидание встречи с внеземными созданиями. Космические корабли уже достигли поверхности Венеры и Марса, были запущены искусственные спутники Юпитера и астероидов, а космический аппарат "Voyager-1" сделал снимок Земли с расстояния 6 млрд километров. Но ощущение «инопланетного наблюдения» продолжало будоражить землян. Образы пришельцев варьировались по шкале от максимального позитива в духе «Альфа» (1986-1990) и героев фильма «Батарейки не прилагаются» (1987) до леденящего ужаса «Чужого» (1979).

В 90-х мы продолжали своеобразный диалог с «братьями по разуму» или злонамеренными интервентами  в «Секретных материалах» (1993), фильмах  «Пятый элемент» (1997) и «Люди в черном» (1997).

Эта эпоха подарила нам и «Футураму», и «Рейнджеров», которые сказались на культуре гиков. В мире видеоигр произвела фурор "X-COM: UFO Defense".

Из магнитофонов и приемников звучали такие «космические» композиции, как:

  • Beastie Boys – Intergalactic (1998);
  • Radiohead – Subterranean Homesick Alien (1997);
  • Ash – Girl From Mars (1996). Кстати, некоторое время эта песня использовалась NASA как музыка для ожидания на телефонной линии.

Если верить знаменитой песне «Землян» «Трава у дома» (1982), то рокот космодрома уже никому не снился.  

Возвращение мечты

В 2002 году была основана компания «SpaceX» – вдохновением для магната Илона Маска послужило «Основание» Азимова и его идея жизни на Марсе. В сознании людей стала укореняться мысль, что делать на нашей планете больше нечего.

Во многом благодаря Илону Маску, давшему столько сочных поводов для сетевых мемов, космос вновь вернулся к нам. На первом плане оказались сюжеты о том, как освоить дальние миры – чего стоит «Марсианин» с его выращиванием картошки.

День космонавтики – отличный повод познакомиться с фильмами 21 века, расширяющими наш взгляд до масштабов Вселенной:  

  • «Космос как предчувствие» (2005);
  • «ВАЛЛ-и» (2008);
  • «Гравитация» (2013);
  • «Интерстеллар» (2014);
  • «Время первых» (2017).

Тема космоса в последнее десятилетие так «выстрелила», что в октябре 2012 года The Walt Disney Company приобрела Lucasfilm (компания-производитель «Звездных войн») с правами за $4,05 млрд. Вышла трилогия сиквелов саги:

  • «Звездные войны. Эпизод VII: Пробуждение силы» (2015);
  • «Изгой-один. Звездные войны: Истории» (2016);
  • «Звездные войны. Эпизод VIII: Последние джедаи» (2017).

Романтика путешествий также нашла воплощение в кино о милых и забавных «Стражах галактики».

В видеоиграх тоже произошло возрождение космической тематики:

  • "Mass Effect" (2007);
  • Перезапуск "XCOM: Enemy Unknown" (2012);
  • "Kerbal Space Program", где нужно построить космический корабль, а затем запустить и посадить его. И это вовсе не так просто, как кажется. Ничего не напоминает?

Благодаря достижениям современной космонавтики у человека снова появилась надежда на то, что мы освоим далекие галактики. А увлеченные технологиями гики остаются преданы теме космических странствий – всеми мыслями, мониторами и экранами, наушниками и джойстиками.

Помните, что в первом ряду на Mission Control запуска Falcon Heavy сидели программисты!

Ведь чтобы изучать космос, не обязательно крутиться в центрифуге. Можно изучать языки программирования «поближе к железу» и получить свой шанс прикоснуться к звездам.

Пройти обучение

10 апр 18, 19:12
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

«Сканер безопасности»: студенты GU о своем проекте

Знания и практика не могут друг без друга. По крайней мере, так происходит в GeekUniversity. Наши студенты регулярно создают проекты, способные выйти за рамки учебных. «Сканер безопасности» – не исключение. Web-приложение разработали студенты факультета Python-разработки. Мы поговорили с основателем проекта Евгением Колобовым и другими членами команды – Вадимом Вакиловым, Даниилом Ширгазиным и Сергеем Столяровым. Ребята рассказали о процессе создания сервиса, его концепции и перспективах. Чем живут проекты и как GeekUniversity помог студентам на профессиональном фронте – в этом материале.

Рождение идеи

Евгений Колобов, основатель проекта «Сканер безопасности»: «В рамках курса нужно было предложить свою идею — я и предложил. Информационной безопасностью я занимался еще до поступления в GeekUniversity. Я хорошо разбираюсь в этой области, поэтому мысль создать «Сканер безопасности» пришла ко мне практически сразу.

Обучение помогло мне понять, как именно можно реализовать свои идеи. Прежде всего я осознал, что хочу развиваться в web-направлении, и расширил свой кругозор. Это мой второй проект в GU и первый опыт командной разработки. Очень хотелось сделать не просто учебный проект, а что-то действительно полезное, способное кого-то заинтересовать. Так мы собрали команду и приступили к реализации задуманного».

Команда и обязанности

Команда «Сканера безопасности» состоит из четырех студентов GeekUniversity:

Евгений Колобов — автор идеи и основатель проекта: «Сначала мы присматривались, притирались, знакомились. Дальше стало проще распределять обязанности. Я занимаюсь координированием команды, выбором сканеров, фронтендом и развертыванием его на боевом сервере. Сперва мы тестируем продукт, после чего я выкатываю в интернет. Команда у нас небольшая, обязанностей много и они очень разные».

Вадим Вакилов — разработчик: «Прежде всего мы придумали стандартную схему: кто и что делает. Моя часть — базы данных, методы и классы, а также генерирование отчетов в HTML и PDF. В рамках проекта я написал модули для отправки конечному пользователю и модуль по сканированию».

Даниил Ширгазин — разработчик: «Я создал архитектуру и немалую часть бэкэнда. Не могу сказать, что столкнулся с какими-либо сложностями».

Сергей Столяров — разработчик: «Я сильно загружен на основной работе, поэтому в нашей команде большая часть обязанностей легла на ребят. Моя же роль в проекте скорее административная. В основном — регистрация доменов и работа с базами данных».

По словам Евгения Колобова, самое главное в командной работе — проявлять интерес к поставленной задаче и уметь общаться друг с другом. Действовать слаженно и понимать, что от твоей работы зависит общий результат.

«Сканер безопасности»: суть и перспективы проекта

Концепция

Студенты создали онлайн-сервис, тестирующий сайты на наличие уязвимостей. С его помощью можно бесплатно проверить свой интернет-ресурс на безопасность, не занимаясь сложной аналитикой или поиском подходящего ПО. Это удобно для малого бизнеса: затраты на штатных программистов не всегда приносят компаниям выгоду, а сами предприниматели могут не разбираться в IT-технологиях. «Сканер безопасности» — простое опенсорсное решение, чтобы сделать информационную безопасность доступной для всех.

Евгений Колобов, руководитель проекта: «Чтобы проверить свой продукт на дыры и уязвимости, нужно иметь квалифицированных разработчиков или собственные сервисы. Например, интернет-магазинам не очень выгодно содержать таких сотрудников в штате — гораздо проще проверить безопасность на бесплатных ресурсах. Наш сервис объединяет в себе разные сканеры, с помощью которых анализирует продукт и выдает клиенту отчет о его состоянии. Владеть такой информацией полезно, если вы хотите защитить свой сайт и его пользователей».

Сервис прост в использовании:

Сначала вы регистрируетесь и указываете e-mail, на который хотели бы получать отчеты о безопасности.

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

Сервис автоматически сканирует указанные ресурсы.

После этого вам на почту будут приходить регулярные отчеты (раз в неделю). Услуга бесплатна и действительна в течение всего периода регистрации.

Евгений Колобов, руководитель проекта: «Отчеты дают клиенту возможность самому оценить безопасность продукта: есть ли у сайта уязвимости, SQL- или XSS-инъекции, какие порты открыты и так далее. Если проблема обнаружена, пользователь может приступить к ее решению и избежать более крупных потерь. Для этого можно обратиться к более квалифицированным специалистам или действовать самому — выбор всегда за вами».

Даниил Ширгазин, разработчик проекта: «Проект интересен тем, что позволяет проверить безопасность на базовом уровне. Мало кто будет ставить разные утилиты для сканирования и проведения атак или разбираться, как они работают. В „Сканере“ достаточно просто добавить IP-адрес своего сервиса и получить на выходе подробный отчет».

Как это работает

Евгений Колобов, руководитель проекта: «Мы агрегировали воедино разные опенсорсные сканеры, которые уже развернуты на сервере и работают достаточно хорошо. Далекому от IT человеку будет сложно искать и запускать эти сканеры самому. А здесь уже все готово, собрано и ждет. Все, что вам нужно сделать — создать учетку.

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

Архитектура сервиса позволяет добавлять новые сканеры — и это огромный плюс. В мире постоянно появляется что-то новое: мы отслеживаем тенденции и стараемся делать наш проект актуальным. Web-приложение использует только те сканеры, которые зарекомендовали себя хорошо».

Задачи и перспективы

Студенты GeekUniversity создают проекты не только ради подкрепления знаний. У каждого из них есть потенциал выйти на реальный рынок. Разработчики «Сканера безопасности» рассказали, как видят свой проект в перспективе, что уже готово и над чем предстоит поработать.

Готово:

  • Архитектура сервиса, позволяющая разработчикам встраивать инструменты для сканирования.
  • Веб-приложение, позволяющее пользователям добавлять свои сайты.
  • Функция доставки отчета на почтовый адрес клиента.

Задачи на будущее:

  • Дальнейшая интеграция инструментов для сканирования.
  • Реализация административного интерфейса управления.
  • Работа над дизайном.
  • Разработка REST.

Евгений Колобов: «Сервис уже готов: сейчас мы пополняем базу сканеров и постепенно планируем внедрять новые. К настоящему моменту полностью разработаны архитектура и личный кабинет. Все процессы автоматизированы, что очень удобно — не нужно привлекать дополнительные человеческие ресурсы.

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

Бесплатное предварительное сканирование дает нам возможность набрать базу клиентов, которые захотят к нам обратиться в дальнейшем. Например, пригласить к себе в офис для проверки сетевой инфраструктуры. Поэтому сейчас очень важно завоевать доверие аудитории"

Дорога в IT и роль GeekUniversity

По словам студентов, GeekUniversity действительно повлиял на воплощение идей в реальную жизнь. До поступления в онлайн-университет многие не имели глубоких познаний в программировании, не говоря уже о разработке собственного стартапа. Кто-то уже работал в сфере IT, но по другой специальности. Кто-то занимался программированием на любительском уровне, а кто-то и вовсе погрузился в него с нуля. Посмотрим, как пришли в разработку создатели «Сканера безопасности» и чем им помогла учеба в GU.

Евгений Колобов: «Я работаю в смежной с программированием сфере. Закончил факультет информационной безопасности МИРЭА, но полученных знаний не хватало для коммерческой разработки. Это были базовые вузовские вещи: в основном, математика и компьютерные сети, связанные с телекоммуникациями. Со временем я понял, что опыта в разработке мне не хватает, а значит пора повышать свою квалификацию.

Я пошел в GeekUniversity с целью выучить Python — здесь я и углубился в разработку основательно. Благодаря учебным проектам ты получаешь реальную практику, и наш — не исключение. Считаю, что обучение в GU — это более эффективно, чем попытки познать все самому. Во-первых, здесь отличные преподаватели, способные поделиться ценным личным опытом. Например, Леонид Орлов, благодаря которому я узнал о важных нюансах коммерческой разработки. Во-вторых, ты погружаешься в коллектив и можешь учиться на примерах своих одногруппников или более опытных коллег. Тебе всегда подскажут и дадут совет. Что касается проекта — это живая задача, позволяющая пополнить твое резюме. Как и ценный опыт командной разработки».

Вадим Вакилов: «По основному образованию я инженер-гидравлик. Сейчас — начальник участка на заводе дозировочной техники. До недавнего времени я думал, что коммерческое программирование — это недостижимая цель. Но позже пообщался с разработчиками и понял: все возможно, если потрудиться. В этом плане GeekUniversity мне очень помог.

Я работаю на заводе, где многие трудятся, потому что должны, а не потому, что хотят. Здесь — наоборот: все видят результаты друг друга и стремятся сделать по максимуму. Особенно в совместных проектах. Единственная сложность — нехватка времени для совмещения учебного проекта с основной работой. Многие вещи приходится доделывать по ночам.

«Сканер безопасности» — мой первый проект в IT. Bсе, что я знаю о разработке на данный момент, я почерпнул из обучения в GeekUniversity. Когда я учился самостоятельно и черпал знания из форумов, часто сталкивался с вредными советами. Им начинаешь слепо следовать, будучи неопытным. В университете такого нет: здесь информация проверена и структурирована, что важно для меня. Ты понимаешь, что именно должен знать и где это можно найти».

Сергей Столяров: «В IT-сфере я со времен института, но до определенного момента знаний на практике не применял. По крайней мере, если говорить о серьезной разработке. Раньше я писал программы, но скорее на любительском уровне — не на таком, как мы это делаем в GeekUniversity. Python — это новый язык для меня, который я освоил благодаря GU. Курсы построены интересно, особенно подготовительный курс по Python: очень понравился преподаватель и способы донесения информации.

Сейчас я главный инженер операционной IT-поддержки. Занимаюсь поддержкой приложений и технологической инфраструктуры. Иногда эти знания удается применить не только в учебных проектах, но и на основной работе (несмотря на то, что непосредственно разработка в мои обязанности не входит). У меня уже созрела идея для стартапа, где точно пригодится полученный в GU опыт. Особенно курс по управлению проектами. Но подробности хотелось бы рассказать уже после того, как идея воплотится в жизнь».

Даниил Ширгазин: «Мне нравится обучение в GeekUniversity. Изначально я хотел выучить Python больше для себя, чем для профессиональных целей. Работаю я по другой специальности — операционным менеджером в сфере промышленной электроники. При этом навыки программирования иногда могут пригодиться и в этой профессии. Например, Python помогает автоматизировать работу с данными и отчетами. В перспективе хочу переписать на Python свой проект, который делал для одной крупной компании»

Полезные советы

Создать собственный проект способен каждый, а GeekUniversity готов помочь в любых начинаниях. Поэтому напоследок — несколько простых советов, которые могут пригодиться при работе над стартапом:

  • Мечтайте и думайте. Не бойтесь себя и своих идей — никогда не знаешь, какая из них выстрелит наверняка.
  • После мозгового штурма постарайтесь оценить, как эти идеи впишутся в реальный мир. Попробуйте ответить на эти вопросы: насколько полезен ваш продукт, как он соответствует тенденциям рынка, в чем его уникальность, зачем это нужно вам и вашим потенциальным клиентам. Неудачные идеи отфильтруются сами собой, а удачные выведут вас на следующий этап.
  • Один в поле не воин. Умение работать в команде — более чем важно. Найдите единомышленников, проконсультируйтесь с более опытными коллегами и соберите свою команду. Для этого стоит чаще появляться в местах по интересам: посещайте курсы, мастер-классы или хакатоны. GeekUniversity — площадка, объединяющая талантливых людей и настоящих профессионалов.
  • Когда команда собрана, познакомьтесь поближе, внимательно изучите друг друга. Определитесь, какие сильные и слабые стороны есть у каждого из вас. Это поможет при распределении задач.
  • Составьте план действий. Желательно письменно — это поможет лучше структурировать мысли. Определите цели и задачи. Поделите их на глобальные и текущие. Расставьте приоритеты. Обозначьте сроки, хотя бы примерные. Тогда вы будете знать: задачу надо выполнить за конкретный период времени, для этого нужно то-то и то-то, потому что так-то и так-то. Такой подход будет держать вас в тонусе, даже если все пойдет не по плану.
  • Не бойтесь поражений, анализируйте ошибки, старайтесь извлекать пользу даже из самых жесточайших провалов.
  • Выстраивайте коммуникацию. Слушайте друг друга. Не стесняйтесь просить о помощи и помогать, спрашивать и отвечать. Важно, чтобы все участники проекта стремились к одной цели и были мотивированы на ее достижение. Совместная работа должна приносить кайф, а не судороги от слова «понедельник».
Пройти обучение

5 апр 18, 19:36
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0
Темы с 21 по 26 | всего: 26

Последние комментарии

нет комментариев
Читать

Поиск по блогу

Люди

7 пользователям нравится сайт lena2018.mirtesen.ru