• Нужна книга по Python для начинающего ребенка?

    @PolkovnikBrumel
    Недавно видел вот такую Программирование для детей. Вроде подходит под ваши критерии.
    Ответ написан
  • Как убедиться, что все дочерние процессы завершили работу?

    Удобнее всего писать в еще одном процессе. Его задачей было бы ожидать данные из очереди по get() и писать все полученное в файл. Очевидно, тут есть проблема, что процесс никогда не завершится, но она легко решается: в главном процессе вы ждете завершения всех процессов-воркеров по join(), после чего посылаете в очередь какое-нибудь "интересное" значение (я бы послал None), после чего ждете завершения процесса-писателя опять же по join(). При виде "интересного" значения пишущий процесс завершается. Ну и главный процесс тоже завершается, соответственно. Как будто бы выглядит не очень красиво, НО это нормально: нужен какой-то механизм, который бы сказал, что "в очередь больше не придут", что мы и делаем в главном процессе. Можно расширить очередь, кидать исключения, но, думаю, None вполне достаточно. Кстати, для этого можно использовать Pipe() в случае с процессами, но я бы точно не стал так делать, потому что зачем? :)

    Меня, кстати, недавно что-то подобное тревожило, искал инфу и понял, что эта задача очень похожа на шаблон producer-consumer, только у нас производящий процесс еще и обрабатывает данные, а получающий процесс только пишет. В C#, кстати, есть специальная коллекция, которая может "закрыться". А вот что пишет по этому поводу Java:

    A BlockingQueue does not intrinsically support any kind of "close" or "shutdown" operation to indicate that no more items will be added. The needs and usage of such features tend to be implementation-dependent. For example, a common tactic is for producers to insert special end-of-stream or poison objects, that are interpreted accordingly when taken by consumers.

    Special end-of-stream or poison objects, КАРЛ! Это я как бы оправдываюсь, что нормальное решение предлагаю. :)))

    Писать в главном процессе неудобно. В таком случае мы не можем вызвать join() у воркеров, поэтому нужен иной способ убедиться, что задачи закончены. Кажется, что для этого можно использовать методы task_done() и join() у очереди. Можно было бы затолкать адреса серверов в очередь (пусть будет q_in), в воркере делать q_in.get(), обрабатывать данные и класть в другую очередь (назовем ее q_out), после чего вызывать q_in.task_done(). НО у нас снова блокирующий метод q_in.join(), который ждет завершения всех задач. Т.е. такая возможность тут не катит. Да даже если бы он не блокировал, то все равно пришлось бы делать sleep() в цикле, что совсем некрасиво. Тут правильно вызывать блокирующий get() в пишущем процессе и завершаться по получению какого-то сигнала. Этим сигналом будет либо отправка "интересного" значения (и в случае записи в главном процессе это сделать некому, х̶о̶т̶я̶ ̶м̶о̶ж̶н̶о̶ ̶с̶д̶е̶л̶а̶т̶ь̶ ̶о̶т̶д̶е̶л̶ь̶н̶ы̶й̶ ̶п̶р̶о̶ц̶е̶с̶с̶ ̶д̶л̶я̶ ̶э̶т̶о̶г̶о̶,̶ ̶г̶о̶в̶о̶р̶и̶т̶ ̶и̶з̶в̶р̶а̶щ̶е̶н̶е̶ц̶), как я уже сказал выше, либо же можно ввести еще одну сущность, назовем ее "глобальный счетчик". Т.е. он должен уменьшаться после того, как в очередь складывается результат. А главный процесс может проверять, не равен ли этот счетчик нулю после того, как сработал get() на очереди. И если равен, то выйти из бесконечного цикла, заджойниться к воркеркам, и завершиться. Но ведь это менее красиво, чем отдельный пишущий процесс: придется создать глобальную переменную и если с тредами можно было бы обойтись простым локом, то в случае с процессами там какой-то геморрой 100%, я никогда так не делал, ведь глобальные переменные - зло. В общем, с какой стороны не подойти, нужно писать в отдельном процессе, иначе можно изобрести что-нибудь.

    Хочу еще пару вещей тут заметить.

    Вам точно нужно писать по мере поступления данных? Быть может, это не нужно. Ведь там постоянные открытия/закрытия файла будут, это тоже некий оверхед, нужно ли это по-настоящему? Кроме того, нужны ли именно процессы? Там сложная обработка данных, сколько она времени занимает относительно ввода/вывода? Если некритично мало, то лучше использовать треды, в таком случае с ними все может оказаться быстрее. Кроме того, с тредами появляется возможность использовать глобальные объекты, которые я все-таки использую, хотя они и зло. Можно, например, вместо Queue использовать list/set/dict. В cpython они является threadsafe, но лучше на всякий случай использовать локи в таком случае, они вносят совсем небольшой оверхед, но при этом 100% защитят от интересных проблем (я бы сделал класс LockedIterator в таком случае, чтобы было универсально для всего). Главный плюс в том, что они значительно быстрее, чем Queue, даже с локами (по моим тестам, хотя, думаю, можно это и нагуглить). А ведь вам, по сути, прелести Queue и не нужны, если юзать треды. То есть вы уверены, что процессы + плавно писать в файл - это быстрее/удобнее/лучше, чем просто сделать треды без Queue, дождаться завершения, все записать в файл? Хотя тут тоже могут быть сложности с оперативой, если очень много писать нужно.

    Кроме того, а почему не, например, ansible? Он умеет опрашивать хосты и принимать в себя плагины на питоне. Кроме того, там есть асинхронные задачи, я их не использовал, но, по-моему, они справятся.
    Ответ написан
    3 комментария
  • Парсер на Python, как реализовать?

    un1t
    @un1t
    grab, scrapy - это все ернуда, request + lxml самое то. В более сложном случае понадобиться selenium и phantomjs.
    Ответ написан
    5 комментариев
  • Холиварный вопрос. Альтернатива "IDE" Brackets?

    @Chekhoved
    Есть всего 3 варианта:

    1. Sublime Text 3
    2. Sublime Text 3
    3. Sublime Text 3
    Ответ написан
    5 комментариев
  • Какова сумму цифр в факториале числа 337?

    factorial = lambda n: (n == 0 and 1) or factorial(n - 1) * n
    sum(int(i) for i in str(factorial(337)))    # => 2817
    Ответ написан
    Комментировать
  • Замена числа. Есть функция?

    adugin
    @adugin Куратор тега Python
    ''.join(random.sample('0123456789', 4))
    Ответ написан
    1 комментарий
  • Пожайлуста дайте советы по улучшению программного кода?

    @bromzh
    Drugs-driven development
    Фигнёй ты страдаешь. Сперва изучи работу со строками и числами, списки, кортежи, множества, словари, итераторы и генераторы. Потом функции поизучай, как они в питоне определяются и вызываются, как передавать аргументы, зачем нужны одинарные и двойные звёздочки в параметрах функции. Потом изучай ООП, какое оно в питоне, чем отличается от других реализаций. Зачем и когда вообще нужны классы, а когда нет. Потом всякие фишки питоновские касательно классов, что такое классовая переменная, метод класса, статический метод, property. Потом можно изучить декораторы и другие функциональные штуки питона. Заодно поймёшь, что это за лямбды у тебя в коде, что такое замыкание и контексты видимости переменных. Потом изучай стандартную библиотеку: работу с датами, с json, с сетью, файлами и сокетами, асинхронный ввод-вывод (надеюсь ты 3-ю ветку изучаешь).
    Попутно вызубри pep8. Ну и всё это естественно на практических примерах. Примеры есть на всяких codeacademy и других подобных сайтах.
    Потом можешь выбирать направление и изучать библиотеки и фреймворки, которые люди часто используют. Если это, например, веб - то это django, tornado и пр.

    А бездумное копирование кода с видео. который ты сам не понимаешь и простыни довольно однотипного кода tkinter не помогут тебе в изучении этого прекрасного языка.
    Ответ написан
    1 комментарий
  • Как обращаться к функции\методу каждый раз перед вызовом другой?

    @Mintormo
    Почитайте про декораторы. Возможно, это то что нужно -habrahabr.ru/post/141411

    А конкретнее вам нужен декоратор метода. Это во второй части статьи что указана в ссылке.
    Ответ написан
    4 комментария
  • Как быстро запустить несколько окон vlc в windows c помощью python и libvlc?

    @vilgeforce
    Раздолбай и программист
    А vlc.exe какой-нибудь там есть? Может либа не нужна, в итоге?
    Ответ написан
    4 комментария
  • Где в коде ошибка?

    @iegor
    Вы скопипастили, а интерактивный режим читает построчно. Необходимо либо писать по строке, либо написать в модуле и модуль импортировать
    Ответ написан
    Комментировать
  • Подойдет ли ноутбук для программирования?

    @FoxInSox
    Толщина
    25.3 мм

    Толстоват. Не подойдет.
    Ответ написан
    1 комментарий
  • Создание бота. Какой язык программирования выбрать?

    @slepowl
    учу-верчу python
    ИМХО, на python вашу задачу вы решите в среднем за месяц. По сути это основы + пара библиотек (request, urllib для начала, scrapy потом). Вы изучите: основные понятия, алгоритмы, подходы ( т.е. основы основ). После этого можно браться за Django или Flask. Затем учить тот же js будет проще (основа есть).

    В случае с js+Node у вас уйдет время еще и на изучение фрэймворка. Первый скрипт вы на коленке соберете не скоро.

    Мне лично python дался легче, чем js. Поэтому начал с него и не жалею. Щас потихоньку изучаю js - дается гораздо легче.
    Ответ написан
    1 комментарий
  • Можно ли проверить строку на значение в блоке try-except?

    @deliro
    Да пожалуйста:
    try:
        if s1 != s2:
            raise ValueError('Но зачем?')
    except ValueError as e:
        print('Действительно, зачем?')
    Ответ написан
    1 комментарий
  • Sublime text, как сделать следующее?

    sabramovskikh
    @sabramovskikh
    По 1 и 2 пункту нужно в Preferences --- Settings User прописать
    {
    	"fallback_encoding": "Cyrillic (Windows 1251)",
            "open_files_in_new_window": false,
    	"word_wrap": true
    }

    fallback пригодиться если будете открывать файлы в cp1251, чтобы небыло кракозябр
    Воббще посмотрите найтройки Default, там для мака есть что-то отдельно
    Плагин для ftp погуглите, ищется сразу же
    Ответ написан
    Комментировать
  • Вопрос по SublimeText?

    honestua
    @honestua
    hi
    В preferences -> Settings-User нужно добавить
    "draw_white_space": "all"
    Ответ написан
    Комментировать
  • Как сделать глобальный Enum в Python 2.7?

    как таковые родные перечисления появились только в 3,4, но есть бэкпорт https://pypi.python.org/pypi/enum34 вплоть до 2,4
    Но вполне возможно вам хватит и атрибутов класса?
    class A(object):
        B = 0
    print A.B  # 0
    Ответ написан
    2 комментария