Найти - Пользователи
Полная версия: потоки, как зацепить запущенный в виде поток
Начало » Django » потоки, как зацепить запущенный в виде поток
1 2
Evg
Есть вид внутри которого запускаю поток:

def(req):
from threading import Thread
import time
def go():
while 1:
print 'mega task process'
time.sleep(5)

t = Thread(target=go,args=())
t.start()
когда я несколько раз запускаю вид (обновляю страницу) создается еще один поток и так можно создать много потоков, которые будут идти паралельно от запроса.

Вопрос как можно ухватить уже созданые потоки и например их закрыть? те видимо нужно как то идентфицировать поток и куда то складывать уже запущенные..но что то не знаю через что это можно реализовать?
Evg
А блин сам же и ответил на свой вопрос)

thread_store = []

def directory(request, page=1):


from threading import Thread
import time


def go():
while 1:
print 'mega task process'
time.sleep(5)

t = Thread(target=go,args=())
t.start()
print t
thread_store.append(t)
Evg
насколько вообще коректно такое решение, для запуска переодически выполняющихся действий запустить в views.py приложения в отдельном потоке требуемую задачу, какие есть подводные камни? или может это как то более грамотно можно сделать?
Oduvan
Можно вот так http://www.lyabah.com/?p=312

создавать джанговские stand alone скрипты, которые к примеру, будут запускаться раз в минуту, и проверять в базе, нет ли отложеных заданий для них. А во вьюхе оставлять задания.
Evg
а в чем преимущества? меня больше интресует инициализация потока - вижу проблемы в том что нужно настраивать крон и потом еще решать проблему чтобы крон не запускал несколько копий скрипта паралельно.

В моем же случае на сколько я понимаю,просто запускается поток когда view.py запускается - те только один раз, и крутится себе отдельно, без вышепречисленных проблем.

может тот случай лучше тем что если у меня что грохнется в потоке то он заново не поднимится, но это опять же можно ловить try catch + добавить в какой нить вьюхе на то чтобы поток работал проверку.
Александр Кошелев
Evg
насколько вообще коректно такое решение, для запуска переодически выполняющихся действий запустить в views.py приложения в отдельном потоке требуемую задачу, какие есть подводные камни?
Абсолютно некорректно.

- Процесс может умереть в любой момент, потащив за собой все треды
- Процессов может быть несколько
- Дополнительное глобальное состояние
- Потеря производительности
- Неконтролируемость
Evg
или может это как то более грамотно можно сделать?
Да, перестать использовать веб сервер для тех задач, для которых он не предусмотрен.

Запускать скрипты по расписанию должен специальный планировщик, например cron.
Evg
вижу проблемы в том что нужно настраивать крон
Там нечего настраивать:-)
Evg
потом еще решать проблему чтобы крон не запускал несколько копий скрипта паралельно.
Любой разделяемый лок - файловый например.
Evg
В моем же случае на сколько я понимаю,просто запускается поток когда view.py запускается - те только один раз, и крутится себе отдельно, без вышепречисленных проблем.
Проблемы смотри выше. И то это только самые очевидные.
Evg
Daevaorn
- Процессов может быть несколько
- Неконтролируемость
буду благодарен если про эти пункты по подробнее раскажете) почему может быть несколько?

Daevaorn
- Процесс может умереть в любой момент, потащив за собой все треды
существуют ли способы тогда породить их в отдельном процесе,чтобы они не умерали вслед за ициицирующим их процессом?
Oduvan
Daevaorn
- Процессов может быть несколько
- Неконтролируемость
треды привязываются к процессу, и контролироваться могут только им, а на сервере у тебя сразу вращается несколько джанго-процессов. Поэтому запрос на старт таска может прийти на один процесс, а стоп на другой.

Еще вариант, сокет сервер, а в нем треды. Теперь вместо создания нового треда ты делаеш запрос к сокет серверу.

Но я не понял минусы в юзании базы. Делай напротив тасков флаги типа (выполняется, выполнен, ожидает). У пускай каждый следующий скрипт забирает следующий таск в ождидании. Но так хоть есть уверенность, что если уж флаг стал “выполнен”, то его ктото выполнил :)
Evg
Oduvan
Поэтому запрос на старт таска может прийти на один процесс, а стоп на другой.
ну у меня там нету стартов стопов тасков, мне просто нужна вещь которая бы постоянно выполнялась - а именно доставала юезеров которые давно не были на сайте и делало им напоминание на почту.

Т.е я правильно понял схему что приходит запорс, он поднимает питон тот создает процесс, тк запросов много то и процессов много.
Но вроде как в моем случае там настроено через fast-cgi т.к питон как бы постоянно весит в памяти и не запускается на новый запрос новый процесс, те в этом случае несколько процессов создаться не может, верно?
Evg
Еще бы хотелось услышать мнения насчет такой схемы:
сделать отдельный файл который запускает все потоки, и запускать его из вида например как отдельный питон скрипт, т.е ‘python script.py’ тогда у всех потоков будет свой отдельный процесс, и сделать чтобы он себя как то помечал что запушен, чтобы дубликаты его не запустились, ну то есть как обычный крон только на питоне получится.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB