Недавно передо мной встала задача, которую было необходимо срочно решать. Проблема была в том, что мне необходимо вызывать 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
Комментарии (6) for Многопоточность или спасибо тебе, Python!
Tweets that mention Многопоточность или спасибо тебе, Python! | aTape.net -- Topsy.com | 04.04.2010 at 6:26 дп
Смотритель | 08.04.2010 at 7:55 дп
Для этого есть форки
HTTP клиент на Python или как написать бота. | aTape.net | 11.05.2010 at 11:34 пп
[...] применение этим скриптам сам. Если вы заглянете в мою предыдущую статью о Python и прикрутите к вышеописанному роботу [...]
Антон | 09.03.2011 at 4:43 пп
os.system все равно неявно делает два форка. и в любом случае php запускается в новом процессе. тут лучше бы os.system(‘php … &’), а еще лучше if not os.fork(): os.execl(‘php’). ну а вообще тут самое место bash-скриптам






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