Специально для заядлых пхпшников, – смотрите как php “сливает” питону

Я как-то рассказывал, что играюсь с вычислением трендов. Так вот, задачка это непростая, — для того чтобы определять устойчивые тренды, нужна обработка большого объема информации, чем больше тем устойчивее тренд виден. Мой бот собирает приблизительно 300-400 тысяч записей за сутки, для того чтобы обрабатывать такой объем, пришлось действительно поломать голову. Для начала, было интересно поиграть с бенчмарками. По итогу бенчмарков, уже написанный бот остался на php, а вот все эксперименты с алгоритмами проводились на питоне, о чем, кстати, ни разу пока не пожалел. Но об этом я уже пробовал писать ранее. Машинка, на которой запускаются просчеты, — двуядерная, в какой-то момент, захотелось распараллелить вычисления, и я окунулся, немного глубже, в работу с потоками на питоне. Честно говоря, это даже проще чем в Delphi, C#, Java. Приведу пример, в котором мы организуем пул задач (грубо говоря ограничиваем кол-во одновременно выполняемых потоков), и пользуемся блокировками для доступа к совместному ресурсу (self.data):

import time
import threading

class Test:

    def __init__(self):
        self.data = 0
        self.lock = threading.Lock()

    def process(self, value):
        for i in xrange(10):
            self.lock.acquire()
            self.data += 1
            print(value),
            print(i),
            print(self.data)
            self.lock.release()
            time.sleep(1)

    def run(self):
        pool = threading.BoundedSemaphore(value=2)
        for i in xrange(3):
            pool.acquire()
            proc = threading.Thread(target=self.process, name="p" + str(i), args=[i])
            proc.start()
            pool.release()

test = Test()
test.run()

0 0 1
1 0 2
2 0 3
0 1 4
1 1 5
2 1 6
1 2 7
0 2 8
2 2 9
1 3 10

Правда, изящно?

UPDATE:
К сожалению, запросто переписав мою систему на запуск в несколько потоков никакого прироста производительности не обнаружилось, скорее наоборот, а питон как работал на одном CPU так и работает. Первая же ссылка подтвердила догадку:

The C implementation of Python uses a global interpreter lock that only
allows one thread to interpret bytecode at a time, so while the threads may
be distributed across multiple processors you will get little or no speedup
over a single processor. (If your threads spend most of their time in a
non-Python extension, they may be able to get some benefit from multiple
processors).

The only way to take advantage of multiple processors with Python is to run
at least one separate process for each processor.

Что в переводе означает: “волшебства не бывает, брат”

Comments

comments

3 comments On Специально для заядлых пхпшников, – смотрите как php “сливает” питону

  • ну, а че нельзя запустить сразу два процесса? можно же организовать (если уже нету) механизм блокировки? тогда два проца нагрузятся

  • Всё верно, Андрюха. Есть такая штука в реализации CPython как GIL (Global Interpreter Lock). Т.е. механизмы блокировки, многопоточное выполнения – всё есть (ну, я совбственно это и показал в примере кода). Так вот, этот самый GIL всё это дело “крутит” на одном процессоре, что сводит на нет всю силу многопроцессорных машин. Вот что я успел найти, с наскока, можно попятаться запустить это на JPython. Можно попробовать такую штуку как http://www.stackless.com, насколько я понял она позволяет запускать несколько инстансов приложения (на разных машинах, CPU), делать локи, межпроцессово взаимодействовать, красота вобщем, надо смотреть.

  • А вот еще, доклад о работе GIL, тут чувак довольно обосновано рассказывает о том что GIL это не зло а благо, но я пока не готов дать адекватной оценки, надо глубже вникнуть.

Leave a reply:

Site Footer

Sliding Sidebar

About Me

About Me

Для кого этот блог?

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

Что заставило меня создать его?

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

Немного о себе.

Мой первый серьезный опыт в IT это работа над desktop приложениями в компании «Эксперт-Софт». У истоков её стояли несколько амбициозных и талантливых молодых людей, с огнем в глазах и желанием работать «как майкрософт». То чем мы там занимались вполне могли бы сегодня назвать «стартапом». Рук было откровенно мало, поэтому приходилось заниматься всем: кодированием на Delphi, написанием скриптов на VBA, дизайном, вёрсткой и поддержкой вебсайта, работой над рекламной полиграфией, проектированием интерфейсов и БД. Работы было много, но запал был велик, команда очень разношерстная, гармонично дополняя друг-друга в решении нетривиальных задач. Благодаря тому что пришлось попробовать многое, постепенно вырисовалось понимание того чем хочется заниматься, и как. Софтверным программированием я был сыт по горло. Массы проблем десктопного софта в вебе просто не было, по определению. Зато был четкий фокус на дизайне, юзабилити, скорости. Поэтому когда пришла пора уходить из «Эксперт-Софт», я без всякого сожаления стал искать работу как разработчик для web. Поскольку городишко у нас не очень большой, выбор был практически предопределен. Так я стал работать в «Оникс-Системз», где и продолжаю работать поныне. За время работы в компании я как разработчик принимал участие в работе над несколькими десятками проектов. Несколько десятков проектов было сделано мною как фрилансером. Самым большим проектом в котором я сыграл роль менеджера, считаю свою семью. Также довольно большой проект мы сейчас поднимаем с командой разработчиков (на данный момент команда состоит из четырех php разработчиков, одного flex кодера и тестировщика). Отсюда, большой интерес к современным практикам и методологиям, разным подходам в управлении командой, повышению эффективности и качества работы. По мере сил, вдохновения и свободного времени, я буду писать об этом.

Если у Вас возникли какие-то вопросы ко мне лично, буду рад если Вы свяжетесь со мной:

e-mail:
skype: denis.sheremetov
Старый сайт, с музычкой и флешом

Прочая онлайновая деятельность: