Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2014 17:30:51

moskrc
От: Воронеж
Зарегистрирован: 2009-03-09
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

Последовательно запускаются shell скрипты, выполнение почти всех из них не занимает очень много времени кроме одного, этот shell скрипт (A) выполняется минут 15.

Когда этот скрипт работает - имеется возможность узнать состояние выполнения через другой скрипт (B).

Как можно сделать выполнение скрипта B по таймеру пока выполняется скрипт A чтобы обновить статус этой долгой задачи.

Схематично:

@task
def create_new_machine(server):
	for i in range(0,10):
		if i == 4:
			# shell скрипт A
			sleep(100500)
		else:
			# оставшиеся скрипты
			sleep(1)
		current_task.update_state(state='PROGRESS', meta={'process_percent': 'data': custom_data, 'step': i})



Офлайн

#2 Сен. 16, 2014 18:25:58

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

Слишком много решений можно предложить, но самое банальное запускать “скрипт B” из “скрипта А”:

scriptA.sh

#!/bin/bash
# Запуск скрипта мониторинга
./scriptB.sh &
sleep 10;
# А теперь его прикончим.
kill -9 $!

scriptB.sh
#!/bin/bash
# Какой-то большой цикл
for i in `seq 100500`;  do
  sleep 1;
  echo $i;
done

Офлайн

#3 Сен. 16, 2014 18:46:35

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

чтобы обновить статус этой долгой задачи

А тут вам или поток или процесс отдельный придется делать.
http://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python

Офлайн

#4 Сен. 16, 2014 18:49:33

moskrc
От: Воронеж
Зарегистрирован: 2009-03-09
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

Вообщем я решил забить на сложности с Celery, решение: в JS цикле на стороне клиента (где progressbar рисуется) когда появится нужный мне STEP_NUM дергать тот опрашивающий скрипт через jQuery и подрисовывать на страницу блок с результатом его выполнения.



Офлайн

#5 Сен. 16, 2014 19:22:58

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

moskrc
решение: в JS цикле на стороне клиента (где progressbar рисуется) когда появится нужный мне STEP_NUM дергать тот опрашивающий скрипт через jQuery и подрисовывать на страницу блок с результатом его выполнения

Можно и так, но если нагрузка высокая лучше тогда отдельный сервсис сделать на websocket.

Офлайн

#6 Сен. 16, 2014 19:24:35

moskrc
От: Воронеж
Зарегистрирован: 2009-03-09
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

Alen
Можно и так, но если нагрузка высокая лучше тогда отдельный сервсис сделать на websocket.

Да, ты прав. Просто тут внутренний проект, большой нагрузки не будет… Вроде все будет хорошо. Спасибо!



Офлайн

#7 Сен. 25, 2014 06:37:55

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Celery, обновление статуса задачи по таймеру

а чем вас не устраивает работа через крон с перепроверкой процессов в состоянии ?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version