среда, 22 марта 2017 г.

Python joblib и GIL: ретроспектива после сессии дебага

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

Сегодня я столкнулся с тем, что некоторые библиотечки питона могут быть зависимы от логики GIL, из-за чего при параллельном выполнении метода вы можете получать System Error: broken pipe, хотя тот же код в один поток будет работать.

В моем случае все осложнялось ещё и тем, что код, который падал, был внутри фикстуры для автоматических тестов, запускаемых с pytest. И без pytest проблема не воспроизводилась, а дебажить работу функции, запускаемой через joblib.Parallel внутри pytest фикстуры это то ещё удовольствие.

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

Решение кроется в использовании альтернативного метода для параллельного запуска кода - multi-threading, который, конечно же, зависит от GIL, но и ваш код не падает, как в случае с multiprocessing.

Чтобы намекнуть joblib использовать multi-threading, вам необходимо указать параметр backend=“threading”, вот так:
from joblib import Parallel, delayed

results = Parallel(n_jobs=200, backend='threading')(
                delayed(your_function)(i, parameter2)
                for i in xrange(10000))
Здесь results будет содержать список возвращаемых функцией your_function значений, your_function - функция, которую мы запустим в 200 тредов, i и parameter2 - параметры, которые будут переданы в качестве аргументов функции your_function (они не обязательные, просто как пример). Значение n_jobs определяет количество тредов, которое будет создано для запуска функции, backend='threading' сообщает интерпретатору что надо создавать именно треды, а не отдельные процессы.

Подробнее об этой библиотечке и этом параметре можно почитать здесь: http://pythonhosted.org/joblib/generated/joblib.Parallel.html

вторник, 7 февраля 2017 г.

Подборка материалов для подготовки к QA Interview (QA, Automation & Python, Linux & Networks)

Всем привет,

как и многие технические специалисты и менеджеры, я проходил и проводил множество технических интервью на позицию QA Engineer / QA Automation Engineer / Software Engineer In Testing и пр., каждая компания называет это по-своему.

Сегодня решил выложить свою подборку ссылок на интересные статьи, позволяющих быстро (за несколько дней) освежить в памяти то, что может пригодиться для прохождения технического собеседования на позицию QA Engineer / QA Automation Engineer.

Когда я сам готовился к прохождению технического интервью, мне помогали похожие статьи (например, эта и эта), но эти статьи были преимущественно ориентированны на разработчиков, поэтому я надеюсь что данная статья будет полезна многим QA инженерам, как пригодилась бы мне раньше :)

Темы, которые надо выучить, чтобы просто не выглядеть неучем (и не только не выглядеть, но и не быть им):

четверг, 21 января 2016 г.

Размышления о карьере QA инженера

Стратоплан выпустил новые бесплатные лекции "Архитектор карьеры":
http://s.stratoplan.net/career-architect-special-offer/index_alt.html

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

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

пятница, 1 января 2016 г.

Китайский для тех кто его совсем не знает - или как перевести новогодние поздравления :)

Сегодня пытались перевести пару фраз на китайском - пожелания / предсказания на 2016 год и оказалось что для этого есть отличный ресурс в Интернете:


Он поддерживает функцию рисования и распознавания иероглифов! :) и она работает, я смог найти все иероглифы, которые были в пожелании, правда перевод ни на этом сайте, ни в гугле не дал особых результатов, но, как минимум, символы распознаны и я могу вставить их в пост:

友妤的建议

А это уже даёт возможность использовать электронные переводчики, форумы и прочее :)

Непредвиденная ошибка с кодом ()

Вот и наступил новый год, а пару дней назад по случаю праздников мы заказывали пиццу в разные локации, и, похоже, заказать пиццу в Москве или Саратове можно без проблем, а вот в Харькове при оплате заказа картой онлайн на сайте одной из пиццерий уже как минимум пол года воспроизводится ошибка - вместо сообщения об успешной оплате заказа сайт радостно сообщает, что произошла неизвестная ошибка с кодом (). Пицца при этом приходит, но вот ты подтвердил оплату и получил подтверждение списания со счёта, а вместо подтверждения оплаты заказа получаешь "неизвестную ошибку" и думаешь придёт тебе заказанный товар или нет.

Написал им сообщение с описанием проблемы, надеюсь поправят.

В Тамбове вообще не обнаружилось пиццерий, которые позволяют оплачивать заказы пластиковыми картами через сайт - только наличными курьеру :)

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

Почему большинству хватает быть не хуже чем другие, и что заставляет немногих из нас становиться с каждым днём лучше чем мы были вчера?

воскресенье, 20 декабря 2015 г.

Подведение итогов - это начало планирования

Полезно иногда подводить итоги. Этот пост не совсем о тестировании, но и о нём тоже.

Когда что-то делаешь, важно знать зачем всё это. Важно, потому что тогда ты сможешь делать это с полной самоотдачей и чувствовать удовольствие от процесса и гордость за результат.

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

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

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

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

понедельник, 7 декабря 2015 г.

Проектирование API клиентов: попробуй использовать сам, прежде чем отдать другим

    Сегодня в очередной раз столкнулся с "сюрпризами", оставленными мне какими-то разработчиками, на этот раз объектом моих экспериментов стал OpenStack Keystone Python client (link).

   Взяв пару примеров из коротких руководств я попробовал получить список OpenStack Endpoints (ссылки для доступа к OpenStack сервисам) - но не тут-то было, примеры из документации отказываются работать.

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

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

    Давайте разберём на примере.