假设我在一个生成多个进程的docker容器中运行多处理服务,docker会使用主机的所有/多个内核/ CPU还是只有一个?
我在这里看过这个例子:
http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
我的所有任务都在名为tasks.py的文件中.
更新芹菜并从示例中添加文件django抛出以下错误,无论我尝试什么:
ImportError: cannot import name Celery
Run Code Online (Sandbox Code Playgroud)
问题可能是由以下原因引起的吗?
app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
Run Code Online (Sandbox Code Playgroud)
因为它遍历所有具有以下导入的tasks.py文件.
from cloud.celery import app
Run Code Online (Sandbox Code Playgroud)
cloud/celery.py:
from __future__ import absolute_import
import os, sys
from celery import Celery
from celery.schedules import crontab
from django.conf import settings
BROKER_URL = 'redis://:PASSWORD@localhost'
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cloud.settings')
app = Celery('cloud', broker=BROKER_URL)
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(settings.INSTALLED_APPS, related_name='tasks')
if "test" in sys.argv:
app.conf.update(
CELERY_ALWAYS_EAGER=True,
)
print >> sys.stderr, 'CELERY_ALWAYS_EAGER = True'
CELERYBEAT_SCHEDULE = {
'test_rabbit_running': {
"task": "retail.tasks.test_rabbit_running",
"schedule": 3600, #every hour
},
[..]
app.conf.update(
CELERYBEAT_SCHEDULE=CELERYBEAT_SCHEDULE
)
Run Code Online (Sandbox Code Playgroud)
retail/tasks.py …
主管在3.0上运行:
pip freeze | grep supervisor
supervisor==3.0
Run Code Online (Sandbox Code Playgroud)
从命令行启动supervisord时:
sudo $VIRTENV/supervisord --nodaemon --configuration $PATH_TO_CONFIG/supervisord.conf
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
2013-11-11 23:30:50,205 CRIT Supervisor running as root (no user in config file)
Run Code Online (Sandbox Code Playgroud)
但是如果没有sudo我就无法启动监督,它抱怨道:
Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)
Run Code Online (Sandbox Code Playgroud)
处理它的正确方法是什么?
(如果以root用户身份启动它,但在supervisord.conf的[supervisord]部分下设置user = foobar,则会出现同样的错误)
更新:这是我的supervisord.conf
[unix_http_server]
file = /opt/run/supervisord.sock
[inet_http_server]
port = 9001
username = foobar
password = foobar
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisord]
logfile = /opt/logs/supervisord.log
loglevel = debug
pidfile = /opt/run/supervisord.pid
[supervisorctl]
[program:foo1]
user = foobar
autostart = …Run Code Online (Sandbox Code Playgroud) 由于Django 1.5原始帖子数据可以通过request.body访问.
在我的应用程序中,我有时会通过表单和有时原始数据(例如json)发送数据.有没有办法写这样一个不会失败的函数?
def get_post_var(request, name):
result = request.POST.get(name)
if result:
return result
post_body = dict(urlparse.parse_qsl(request.body))
result = post_body.get(name)
if result:
return result
return None
Run Code Online (Sandbox Code Playgroud) 我们正在使用Docker Compose文件和Docker Swarm部署我们的服务.我想知道将健康检查放在Dockerfile中是否有任何区别,或者将它放在docker-compose.yml中是否更好.
我觉得我已经阅读了所有可用的文档,但找不到任何内容.
泊坞窗,compose.yml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8081/ping"]
interval: 30s
timeout: 10s
Run Code Online (Sandbox Code Playgroud)
Dockerfile
HEALTHCHECK --interval=30s --timeout=10s CMD curl -f http://localhost:8081/ping
Run Code Online (Sandbox Code Playgroud) 像这样:
const RFC_3339 = 'YYYY-MM-DDTHH:mm:ss';
moment.utc().format(RFC_3339);
Run Code Online (Sandbox Code Playgroud)
我需要时间戳在结尾处有一个'Z'.有没有更好的方式+'Z'呢?
它应匹配后端的python代码:
RFC_3339_FMT = "%Y-%m-%dT%H:%M:%SZ"
Run Code Online (Sandbox Code Playgroud) 我试图在Django中将调试级别更改为DEBUG,因为我想在我的代码中添加一些调试消息.它似乎没有效果.
我的日志配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter': 'simple'
},
},
'loggers': {
'django.request':{
'handlers': ['console'],
'propagate': False,
'level': 'DEBUG',
},
},
}
Run Code Online (Sandbox Code Playgroud)
码:
import logging ; logger = logging.getLogger(__name__)
logger.debug("THIS MESSAGE IS NOT SHOWN IN THE LOGS")
logger.warn("THIS ONE IS")
Run Code Online (Sandbox Code Playgroud)
控制台上的输出:
WARNING:core.handlers:THIS ONE IS
Run Code Online (Sandbox Code Playgroud)
我也尝试在我的设置文件中设置DEBUG = False和DEBUG = True.有任何想法吗?
编辑:如果我直接在记录器上设置日志级别,它可以工作:
import logging ; logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.debug("THIS MESSAGE IS NOT SHOWN …Run Code Online (Sandbox Code Playgroud) 我需要确保从数据库中读取并写回的对象不能在此期间被另一个请求/进程修改.
transaction.atomic()保证吗?
到目前为止我的测试告诉我没有.如果他们没有任何问题,那么实现原子READS和WRITES的正确方法是什么?
我测试过的例子.
将Test类放在模型中的某个位置.atomic_test.py和atomic_test2.py应保存为管理命令.首先运行python manage.py atomic_test,然后运行python manage.py atomic_test2.第二个脚本不会阻止,其更改将丢失.
models.py
class Test(models.Model):
value = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
atomic_test.py
from django.core.management.base import NoArgsCommand
from django.db import transaction
from time import sleep
from core.models import Test
class Command(NoArgsCommand):
option_list = NoArgsCommand.option_list
def handle(self, **options):
Test.objects.all().delete()
t = Test(value=50)
t.save()
print '1 started'
with transaction.atomic():
t = Test.objects.all()[0]
sleep(10)
t.value = t.value + 10
t.save()
print '1 finished: %s' %Test.objects.all()[0].value
Run Code Online (Sandbox Code Playgroud)
atomic_test2.py
from django.core.management.base import NoArgsCommand …Run Code Online (Sandbox Code Playgroud) 如何配置Django logging以支持不同的DSN loggers?
像这样的东西:
settings.py
LOGGING = {
..
'handlers': {
'sentry1': {
'level': 'ERROR',
'class': 'raven.contrib.django.handlers.SentryHandler',
'dsn': '<DSN1>',
},
'sentry2': {
'level': 'ERROR',
'class': 'raven.contrib.django.handlers.SentryHandler',
'dsn': '<DSN2>',
},
},
'loggers': {
'sentry1':{
'handlers': ['console', 'sentry1'],
'level': 'ERROR',
'propagate': False,
},
'sentry2':{
'handlers': ['console', 'sentry2'],
'level': 'ERROR',
'propagate': False,
},
}
Run Code Online (Sandbox Code Playgroud)
views.py
import logging
logger = logging.getLogger('sentry2')
logger.error('yeey!')
Run Code Online (Sandbox Code Playgroud) 我通过supervisord开始芹菜,请参阅下面的条目.
[program:celery]
user = foobar
autostart = true
autorestart = true
directory = /opt/src/slicephone/cloud
command = /opt/virtenvs/django_slice/bin/celery beat --app=cloud -l DEBUG -s /home/foobar/run/celerybeat-schedule --pidfile=/home/foobar/run/celerybeat.pid
priority = 100
stdout_logfile_backups = 0
stderr_logfile_backups = 0
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB
stdout_logfile = /opt/logs/celery.stdout.log
stderr_logfile = /opt/logs/celery.stderr.log
Run Code Online (Sandbox Code Playgroud)
pip冻结| grep芹菜
celery==3.1.0
Run Code Online (Sandbox Code Playgroud)
但任何用法:
@celery.task
def test_rabbit_running():
import logging
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
logger.setLevel(logging.DEBUG)
logger.info("foobar")
Run Code Online (Sandbox Code Playgroud)
没有出现在日志中.相反,我得到如下条目.
celery.stdout.log
celery beat v3.1.0 (Cipater) is starting.
__ - ... __ - _
Configuration ->
. …Run Code Online (Sandbox Code Playgroud) python ×6
django ×5
logging ×3
celery ×2
docker ×2
supervisord ×2
atomic ×1
concurrency ×1
docker-swarm ×1
dockerfile ×1
exception ×1
importerror ×1
momentjs ×1
post ×1
raven ×1
request ×1
sentry ×1
startup ×1
transactions ×1