Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » потоки, как зацепить запущенный в виде поток [RSS Feed]

#1 Май 14, 2009 17:59:20

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

Есть вид внутри которого запускаю поток:

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()
когда я несколько раз запускаю вид (обновляю страницу) создается еще один поток и так можно создать много потоков, которые будут идти паралельно от запроса.

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



Офлайн

#2 Май 14, 2009 18:03:49

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

А блин сам же и ответил на свой вопрос)

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)



Офлайн

#3 Май 14, 2009 18:11:34

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

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



Офлайн

#4 Май 14, 2009 20:33:37

Oduvan
От:
Зарегистрирован: 2008-07-19
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

Можно вот так http://www.lyabah.com/?p=312

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



Офлайн

#5 Май 14, 2009 20:46:06

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

а в чем преимущества? меня больше интресует инициализация потока - вижу проблемы в том что нужно настраивать крон и потом еще решать проблему чтобы крон не запускал несколько копий скрипта паралельно.

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

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



Отредактировано (Май 14, 2009 20:48:25)

Офлайн

#6 Май 14, 2009 21:21:49

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

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

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

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



Офлайн

#7 Май 14, 2009 21:52:59

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

Daevaorn
- Процессов может быть несколько
- Неконтролируемость
буду благодарен если про эти пункты по подробнее раскажете) почему может быть несколько?

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



Офлайн

#8 Май 14, 2009 22:39:57

Oduvan
От:
Зарегистрирован: 2008-07-19
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

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

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

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



Офлайн

#9 Май 15, 2009 00:18:57

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

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

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



Отредактировано (Май 15, 2009 00:21:34)

Офлайн

#10 Май 15, 2009 02:03:24

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

потоки, как зацепить запущенный в виде поток

Еще бы хотелось услышать мнения насчет такой схемы:
сделать отдельный файл который запускает все потоки, и запускать его из вида например как отдельный питон скрипт, т.е ‘python script.py’ тогда у всех потоков будет свой отдельный процесс, и сделать чтобы он себя как то помечал что запушен, чтобы дубликаты его не запустились, ну то есть как обычный крон только на питоне получится.



Офлайн

  • Начало
  • » Django
  • » потоки, как зацепить запущенный в виде поток[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version