Специально для заядлых пхпшников, – смотрите как 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.

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

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.