aTape.net | Программирование и адвертайзинг Программирование и адвертайзинг.
Апр/10

2

Многопоточность или спасибо тебе, Python!


Недавно передо мной встала задача, которую было необходимо срочно решать. Проблема была в том, что мне необходимо вызывать php-скрипт с разными параметрами 100-200 раз одновременно и вешать эти задачи на cron. Что делать? Ведь забивать в crontab тысячи однотипных строк — это совсем не наш метод. Мне понадобилась масштабируемость, которая позволит объединять задачи по однотипным группам и запускать сотни и тысячи действий одной командой.

К сожалению, в языке PHP, с помощью которого я обычно решаю подавляющее большинство возникающих задач, нет ни намека на многопоточность. А любые попытки имитировать ее вызовом скриптов через http и тому подобные штуки, являются очень ресурсоемкими и ненадежными. Но как хорошо, что есть еще один простой скриптовый инструмент в арсенале вебмастеров и программистов — язык программирования Python. Предлагаю Вашему вниманию простой способ решения моей задачи, т.к. уверен, что очень многим этот короткий скрипт будет полезен.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Импортируем необходимые модули
import threading
import string
import sys
import os

# Инициализируем параметр пути к php скрипту
path  = sys.argv[1]

# Инициализируем параметр имени подпапки типов скриптов
group = sys.argv[2]

# Инициализируем массив интервала номеров пользователей account id
aids  = string.split(sys.argv[3], "|")

# Определяем функцию proc(aid), вызывающую php скрипт
def proc(aid):
  # Формируем команду запуска, например "php " + "/home/scripts/" + " " + "parser" + ".php " + "23"
  query = "php " + path + " " + group + ".php " + repr(aid)
  # Запускаем php скрипт как отдельный независимый процесс ОС
  os.system(query)

# Формируем цикл по заданному интервалу accound id (aid)
for x in range( int(aids[0]), int(aids[1])+1 ):
  # Создаем потоки и запускаем функцию proc(aid) нужное количество раз
  threading.Thread(target=proc, name="thread"+repr(x), args=[x]).start()

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

1
2
# запустить файл /home/scripts/parsers.php с параметрами 12, 13,14, 15, ..., 188, 189 одновременно!
$> python run.py /home/scripts/ parsers 12|189

Успехов!

—- Прошло несколько часов. Я обнаружил, что мое решение не позволяет мне запускать более 20ти потоков на моем VDS. И следовательно, возникла необходимость в создании очередей/пуллов потоков. По этой теме нашел хорошую ссылку:
http://www.chrisarndt.de/projects/threadpool/
и собственно сама либа:
http://chrisarndt.de/projects/threadpool/threadpool.py.html

Понравился пост? Подписывайтесь по RSS! Также меня можно найти в Twitter.

RSS Feed

Комментарии (6) for Многопоточность или спасибо тебе, Python!

avatar

Tweets that mention Многопоточность или спасибо тебе, Python! | aTape.net -- Topsy.com | 04.04.2010 at 6:26 дп

[...] This post was mentioned on Twitter by Anton Gorunov. Anton Gorunov said: http://atape.net/mnogopotochnost-ili-spasibo-tebe-python/ Реализация многопоточности с помощью Python — удобство запуска скриптов! [...]

avatar

Смотритель | 08.04.2010 at 7:55 дп

Для этого есть форки :-)

avatar

Author comment by twist | 08.04.2010 at 7:58 дп

Угу. К счастью, я смог ограничиться использованием библиотеки, представленной по ссылке. Ох уж этот Python :-)

avatar

Author comment by twist | 08.04.2010 at 8:00 дп

И форки, если я не ошибаюсь, нужны для мультипроцессорных программ. Мне же нужна была просто многопоточная.

avatar

HTTP клиент на Python или как написать бота. | aTape.net | 11.05.2010 at 11:34 пп

[...] применение этим скриптам сам. Если вы заглянете в мою предыдущую статью о Python и прикрутите к вышеописанному роботу [...]

avatar

Антон | 09.03.2011 at 4:43 пп

os.system все равно неявно делает два форка. и в любом случае php запускается в новом процессе. тут лучше бы os.system(‘php … &’), а еще лучше if not os.fork(): os.execl(‘php’). ну а вообще тут самое место bash-скриптам

Leave a comment!

<<

>>

Find it!

Theme Design by devolux.nh2.me
Login