Войти
ПрограммированиеФорумВеб

django массивные функции

#0
15:15, 7 окт. 2015

как на джанго можно раз в минуту вызывать функцию с большим объемом вычислений?

как можно отложить обработку запросов до ее завершения?

зы потребовалось еще вызывать функцию раз в секунду с относительно небольшим объемом вычислений с доступом к настройкам джанго, но можно не из самого джанго


#1
16:00, 7 окт. 2015

Вот, очень рекомендую поиск гугл.
https://www.google.com/search?q=django+periodic+function+call

#2
19:38, 11 окт. 2015

весь день проплюхался с celery - оказалось все бесполезно : периодичные функции вызываются с ошибкой +-3 секунды - бывает 3 одновременных вызова в 100мс потом 7 секунд задержка

как можно запустить с командной строки питоновский модуль, так чтобы он получил все настройки джанго? ( доступ к моделям и курсору бд при работающем джанго сервере)
едит :: вроде нашел: https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

#3
19:41, 11 окт. 2015

Вот снова рекомендую:
https://www.google.com/search?q=django+celery+how+to+get+config
Ну к твоей чести результат не первый, а десятый
http://stackoverflow.com/questions/21975666/active-django-setting… celery-worker

#4
15:27, 12 окт. 2015

kvakvs
круто ты гуглить умеешь, я бы до таких запросов в жизни не додумался

но все таки с учетом того, что celery не может вызывать функцию с периодичностью в 1 секунду - вернее вызывать то вызывает но периодичность становится .1-3 секунды я думаю запустить питоновский модуль в другом процессе который будет шерстить базу данных джанго ... может конечно у меня с архитектурой приложения полный писец:

b: пользователь в браузере кликает на юнит, кликает место на карте куда идти
s: сервер django удаляет юнит с отображения, отмечает время прибытия
b: phaser.js с цикличностью раз в секунду запрашивает сервер: нет ли обновления позиций юнитов
s: другой процесс раз в секунду шерстит бд на предмет прохода времени прибытия, по проходу для цикла phaser.js устанавливает флаг в бд запросить позиции юнитов, сам юнит добавляется в отображение
b: phaser.js по получению флага в цикле, запрашивает новые позиции юнитов

вот я и думаю, может мне без селери в питоновском модуле сделать бесконечный цикл с пробежкой по бд и сном в 1 секунду? вместо того чтобы мучить селери?

и второй вопрос:

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

в джанго модуль при каждом запросе на сервер запускается или есть какой то питоновский процесс до которого можно достучаться из модуля и он не удаляется между запросами на сервер?

#5
16:05, 12 окт. 2015

despair1
> но все таки с учетом того, что celery не может вызывать функцию с
> периодичностью в 1 секунду - вернее вызывать то вызывает но периодичность
> становится .1-3 секунды я думаю запустить питоновский модуль в другом процессе
> который будет шерстить базу данных джанго ... может конечно у меня с
> архитектурой приложения полный писец:
Верно. Все эти шедулеры и кроны работают хорошо с короткими задачами и интервалом минимум минута.
Если тебе надо каждую секунду то лучше постоянно запущенный процесс.

Тут мы подходим к вопросу твоей архитектуры.
Пункт где phaser.js что-то там запрашивает -- тут слабое место. Сервер должен САМ сообщить всем в зоне видимости вокруг перемещённого юнита об изменениях. Для этого есть long polling (старая технология) и вебсокеты (новая). Тогда действительно тебе нужен постоянно запущенный сервис. Для удобства он может быть на питоне, это может быть не джанго, роли большой не играет, его задача следить кто куда передвинулся и раздавать всем подключенным к нему обновления.

Начни с того, умеет ли джанга в вебсокет, если умеет, то копай отсюда. Пока подключен вебсокет - ты делаешь всю логику в его обработчике, дочитываешь новые сообщения от клиента из сокета и досылаешь обновления в сокет. Если вдруг отключился то просто отмечаешь игрока в мире оффлайн и ждёшь пока он вернётся.
Вот например по запросу "django websocket" чудесный туториал как раз на твою тему: постоянно работающий сервер и связь между разными клиентами через Редис. https://django-websocket-redis.readthedocs.org/en/latest/

#6
17:28, 12 окт. 2015

kvakvs

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

#7
17:37, 12 окт. 2015

despair1
> че-то ппц как там сложно с этими вебсокетами
на самом деле просто надо перестроить своё восприятие от выполнения программы на каждый запрос целиком к постоянному выполнению и запросы приходят и обрабатываются сразу же одной программой, несложно.
> может первые 4 месяца разработки обойтись цикличнми запросами через аякс?
Можно. Но потом будет только труднее переделывать, вернее в какойто момент просто перехочется переделывать и у тебя окажется устаревший монстрокод который лень исправлять и который уже не тащит нагрузку. Выход есть - докупать новые сервера и в какой-то момент вы окажетесь с сотней серваков которые еле тащат несколько тысяч клиентов. Тогда уже деваться будет некуда, перепишете нормально и всё заработает.
> или нагрузка от них на сервер ппц какая будет?
пока у тебя там два десятка школьников гамают, нагрузка будет мало заметна, а потом приятно удивишься.

#8
19:36, 14 окт. 2015

kvakvs
попробовал запустить django websocket redis - чатик из примера запускается, но при интеграции в свой проект выдает:

WebSocket connection to 'ws://127.0.0.1/ws/units_updated?subscribe-user' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

сервер в логах ничего про ws не пишет

код на клиенте:

var ws_host='ws://127.0.0.1/ws/'
var ws4redis = WS4Redis({
    uri: ws_host+'units_updated?subscribe-user',
    receive_message: onUnitsUpdated,
    //heartbeat_msg: {{ WS4REDIS_HEARTBEAT }}
  }); 
настройки джанго:

"""
Django settings for django_test project.

Generated by 'django-admin startproject' using Django 1.8.4.

For more information on this file, see
https://docs.djangoproject.com/en/1.8/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.8/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'c2m*&2)u#0-c1kolj0p*ka$+qz-ovv(5y^!1ou==&!5b4=d@n1'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.static',
    'django.core.context_processors.request',
    'ws4redis.context_processors.default',
)
# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'game',
    'login',
    'djcelery',
    'kombu.transport.django',
    'ws4redis',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'django_test.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                #'django.contrib.auth.context_processors.auth',
                #'django.core.context_processors.static',
                #'ws4redis.context_processors.default',
            ],
        },
    },
]

WSGI_APPLICATION = 'django_test.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'm1',
        'USER': 'm1user',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    },
    'default1': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = ( "/home/despair/evedev/phaser_test/",
                     )
LOGIN_URL = "/login/signin"

WEBSOCKET_URL = '/ws/'

WS4REDIS_EXPIRE = 600

WS4REDIS_PREFIX = 'djt'

import djcelery
djcelery.setup_loader()
BROKER_URL = 'django://'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

from datetime import timedelta

CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'game.tasks.add5',
        'schedule': timedelta(seconds=3),
        #'args': (16, 16)
    },
}

CELERY_TIMEZONE = 'UTC'
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend'

что я делаю нетак?

зы в моем проекте вот эта хрень не запускается:
https://github.com/jrief/django-websocket-redis/blob/master/ws4re… _runserver.py
которая деф run
как в настройказ джанго подсунуть ее на исполнение?

#9
20:39, 14 окт. 2015

эпичненько лопухнулся 3 часа отлаживал и перечитывал доки, а оказалось, что в ws_host номер порта не указал

#10
1:21, 15 окт. 2015

А я подумал зачем мне такая простыня кода и ничего не ответил :) Не задавай так вопросы, простыни читать трудно, и неинтересно.
Гляди, хорошо когда сам начинаешь искать и находишь.

#11
15:08, 15 окт. 2015

kvakvs
> мне такая простыня кода и ничего не ответил
с меньше простыней если отвечают, то "телепаты в отпуске"

kvakvs
> Гляди, хорошо когда сам начинаешь искать и находишь.

я уже не верил, что сам смогу понять как использовать django websocket redis в проекте

но так то вроде прикольная штука показалась - щас бы только с авторизацией разобраться

ПрограммированиеФорумВеб

Тема в архиве.