对于如何禁用DjangoCelery管理模块?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解关闭djangorunserver,并且为您提供关于Celery+Django:无法在Windo
对于如何禁用Django Celery管理模块?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解关闭django runserver,并且为您提供关于Celery + Django:无法在Windows 7上启动celerybeat、Celery Django 在 previus 完成后运行定期任务 [django-celery-beat]、Celery Workers并没有全部用Django将事务写入数据库、Celery 与 Django的宝贵知识。
本文目录一览:- 如何禁用Django Celery管理模块?(关闭django runserver)
- Celery + Django:无法在Windows 7上启动celerybeat
- Celery Django 在 previus 完成后运行定期任务 [django-celery-beat]
- Celery Workers并没有全部用Django将事务写入数据库
- Celery 与 Django
如何禁用Django Celery管理模块?(关闭django runserver)
我不需要Django管理员中的celery模块。有什么办法可以删除它吗?
答案1
小编典典更具体地讲,在admin.py
任何应用程序中的INSTALLED_APPS
后 ''djcelery''
from django.contrib import adminfrom djcelery.models import ( TaskState, WorkerState, PeriodicTask, IntervalSchedule, CrontabSchedule)admin.site.unregister(TaskState)admin.site.unregister(WorkerState)admin.site.unregister(IntervalSchedule)admin.site.unregister(CrontabSchedule)admin.site.unregister(PeriodicTask)
Celery + Django:无法在Windows 7上启动celerybeat
奇怪的问题在这里。 我一直在开发一个Django应用程序,我正在试图实现芹菜。 我需要正常的任务和周期性的任务排队。 我可以启动celeryd就好了,并执行任务(我开始用命令python manage.py celeryd start --settings=settings --loglevel=INFO )。
在Windows上,您不能执行-beat / -b来启用节拍模式; 您需要启动celerybeat作为一个单独的服务(这是芹菜文档的常见问题部分)。 如果我input这个命令行 – python manage.py celerybeat -s djcelery.schedulers.DatabaseScheduler --settings=settings --loglevel=INFO – 我得到一个这样的错误:
[2012-01-02 19:06:52,009: WARNING/MainProcess] ERROR: Pidfile (celerybeat.pid) a lready exists. Seems we're already running? (PID: 2364) [2012-01-02 19:06:52,012: INFO/MainProcess] process shutting down
而celerybeat从来没有真正开始。 所以我不能执行任何周期性的任务…任何想法? 我只find另一个页面 ,有人突出显示了类似的错误,但没有提供解决scheme。
如果有任何进一步的信息需要,请让我知道。 我很困惑,因为我无法find关于这个问题的任何信息,我今天一直在尝试解决这个问题…谢谢。
芹菜没有运行,没有错误信息
在Cordova的Windows桌面支持
在Puppet中处理生成的文件
当从命令行启动时允许Jenkins从webapp重新启动
如何在windows 2012 r2 x64上运行jenkins slave?
如何在Jenkins作业中启动一个Window exe文件
无法将从站连接到主站
无法使用木偶访问远程文件
Windows上的Hudson – 错误:java.io.IOException:无法运行程序“sh”
一个相当于unix tail命令的窗口
在你的文件系统中搜索该pid文件并将其删除。 在unix机器上,通常意味着程序没有正确关闭。 你应该检查它是否已经在任务管理器中运行,如果是的话就杀了它,然后删除那个文件
然后再试一次。
如果没有pid文件,这可能意味着软件有问题,因为它可能是从unix移植过来的?
在我的Windows上的Django项目的情况下,这个文件已经存在于Django项目的根目录中。 我删除了该文件,进程没有任何错误运行。
“celerybeat.pid”已经存在了,因为我从另一台PC上运行了芹菜拍,把git仓库推到了云端。 当我在工作的个人计算机上拉回购软件并运行这个过程时,它给了我错误,指的是另一台PC之前创建的文件“celerybeat.pid”。 删除“celerybeat.pid”使其工作。
Celery Django 在 previus 完成后运行定期任务 [django-celery-beat]
如何解决Celery Django 在 previus 完成后运行定期任务 [django-celery-beat]?
我想使用 django-celery-beat 库定期对我的数据库进行一些更改。我将任务设置为每 10 分钟运行一次。一切正常,直到我的任务花费不到 10 分钟,如果它持续时间更长,下一个任务在第一个进行计算时开始,它会导致错误。
我的任务就是这样:
from celery import shared_task
from .utils.database_blockchain import BlockchainVerify
@shared_task()
def run_function():
build_block = BlockchainVerify()
return "Database updated"
如果之前没有完成,有没有办法避免开始相同的任务?
解决方法
肯定有办法。它正在锁定。
芹菜文档中有整页 - Ensuring a task is only executed one at a time。
简要解释 - 您可以使用一些缓存甚至数据库来放置锁,然后每次启动某些任务时只需检查此锁是否仍在使用中或已被释放。
请注意,任务可能会失败或运行时间比预期的要长。可以通过向锁添加一些过期时间来处理任务失败。并将锁到期时间设置为足够长,以防任务仍在运行。
已经有一个关于 SO - link 的好帖子。
Celery Workers并没有全部用Django将事务写入数据库
如何解决Celery Workers并没有全部用Django将事务写入数据库?
我将Django与Celery结合使用。我的芹菜工作者使用Django及其模型执行数据库事务。我的工作人员中有几个任务,每个任务多次对数据库进行读/写调用。我正在运行6个工人,每个工人并发10个线程。
我面临的问题是它可以正确完成数据库中的所有read
个事务,但是却错过了对数据库进行某些write
个事务的机会。并且它遗漏的write
个事务是一致的。尽管永远不会引发任何异常,但它总是无法在同一时间写入数据库。
我尝试将time.sleep(5)
放在事务之间来给它时间,但没有帮助。我开始认为这是某种连接池问题。
其他人对此有任何想法或经历过同一问题吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Celery 与 Django
-1.前言
Django原生是单线程的,如果遇到执行时间过长的,只能干等着页面返回,而且不能做别的事情。为了解决这种状况,决定采用异步任务(Celery)的方式。
Celery对Windows的兼容性比较差,建议使用Linux系统。但本篇文章,还是在Windows上测试的,不要问为什么,问就是因为穷。
关于Celery的介绍,我们已经在另一篇文章celery概述介绍过了,这一篇是直接干活的文章。示例来自官方文档,本人稍作注释改动。
环境&版本明细
- Windows操作系统
- Python 3.6.8
- Celery 4.4
- Django 2.2.2
- Redis
注:请提前安装好Python,Django,和Redis.
参考文献
- 官方文档
0.目录
- 1.Using Celery with Django
- 2.详解celery.py模块
- 3.使用@shared_task装饰
- 4.扩展
- 5.启动Woreker进程
<h2 id=1>1.Using Celery with Django</h2> >Celery之前需要一个单独的库(djcelery)与Django一起使用,但是从3.1.x(ps:3.1之后就是4.x版本)以后就不再使用了。只需要安装好Celery,Django就可以直接使用了。经过测试发现Celery4.x版本依然可以是和djcelery一起使用,但真的没必要。
要将Celery与Django项目一起使用,必须首先定义Celery库的实例(称为"app")。
如果已经有了一个Django项目,例如:
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py
那么建议的方法是创建一个新的proj/proj/celery.py
模块,该模块定义Celery实例:
文件: proj/proj/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the defalut Django settings module for the ''celery'' program
# 为"celery"程序设置默认的Django settings 模块
os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''proj.settings'')
app = Celery(''proj'')
# Using a string here means the worker dosen''t have to serialize the configuration object to child processes.
# 在这里使用字符串意味着worker不必将配置对象序列化为子进程。
# - namespace=''CELERY'' means all celery-related configuration keys should have a ''CELERY_'' prefix
# namespace="CELERY"表示所有与Celery相关的配置keys均应该带有''CELERY_''前缀。
app.config_from_object(''django.conf:settings'', namespace=''CELERY'')
# Load task modules from all registered Django app configs.
# 从所有注册的Django app 配置中加载 task模块。
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(''Request: {0!r}''.format(self.request))
然后,需要将此模块proj/proj/celery.py导入proj/proj/init.py中。这样可以确保再Django启动时加载该应用,以便@shared_task装饰器(稍后提及)将使用该应用。
文件:proj/proj/init.py
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when Django starts so that shared_task will use this app.
这将确保在Django启动时始终导入应用程序,以便shared_task使用该应用程序。
from .celery import app as celery_app
__all__ = (''celery_app'',)
<h2 id=2>2.详解celery.py模块</h2> 接下来分解一下celery.py模块中发生的情况,更好的来理解。 首先我们从[__future__](http://python-future.org/)中导入`absolute_import`,这样celery.py模块就不会与库冲突: ``` from __future__ import absolute_import ``` 然后,为celery命令行程序设置默认**DJANGO_SETTINGS_MODULE**的环境变量: ``` os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''proj.settings'') ``` 您不需要此行,但是可以避免始终将设模块传递到celery程序中。他必须始终在创建应用程序实例之前出现,接下来要做的是: ``` app = Celery(''proj'') ``` 这是Celery库实例,可以有很多实例,但是使用Django时真的没必要这么干。 我们还需要将**Django settings**模块添加为Celery的配置源。这意味着可以不必使用多个配置文件,从而直接从Django settings中配置Celery。也可以根据要将他们分开。。 ``` app.config_from_object(''django.conf:settings'', namespace=''CELERY'') ``` 大写命名空间意味着所有[Celery配置选项](https://docs.celeryproject.org/en/4.4.0/userguide/configuration.html#configuration)必须以大写而不是小写指定,并以开头CELERY_,例如,**task_always_eager**设置为**CELERY_TASK_ALWAYS_EAGER**。这也适用于工作程序设置,例如,**worker_concurrency**设置为**CELERY_WORKER_CONCURRENCY**。 可以直接传递设置对象,建议使用字符串,因为那样,worker就不必序列化该对象。该`CELERY_`命名空间也是可选的,但是建议使用这个,为了更好的识别和防止与其他设置冲突。 在这里我简单的罗列一下我的设置,有啥需求的,自己点击官方文档[Celery配置选项](https://docs.celeryproject.org/en/4.4.0/userguide/configuration.html#configuration)去学习。
文件:Django的settings.py
CELERY_BROKER_URL = ''redis://localhost:6379/1'' # Broker配置,使用Redis作为消息中间件
CELERY_RESULT_BACKEND = ''redis://localhost:6379/2'' # Backend设置,使用redis作为后端结果存储
CELERY_TIMEZONE = ''Asia/Shanghai''
CELERY_ENABLE_UTC = False
CELERY_WORKER_CONCURRENCY = 99 # 并发的worker数量
CELERY_ACKS_LATE = True
CELERY_WORKER_MAX_TASKS_PER_CHILD = 5 # 每个worker最多执行的任务数, 可防止内存泄漏
CELERY_TASK_TIME_LIMIT = 15 * 60 # 任务超时时间
接下来,可重用的应用程序单独常见做法是在一个单独的tasks.py模块中定义所有任务,而Celery可以自动发现这些模块:
app.autodiscover_tasks()
使用上边这一行,Celery将按照约定自动发现所有已经安装的app中的tasks.py
。
- app1/
- tasks.py
- models.py
- app2/
- tasks.py
- models.py
这样,就可以不必手动将单个模块添加到CELERY_IMPORTS设置中。
最后,该debug_task
示例是一个转储其自己的请求信息的任务。这是使用Celery3.1中引入的新 bind=True任务选项,可以轻松地引用当前任务实例。
<h2 id=3>3.使用@shared_task装饰器</h2> 您编写的任务可能会存在于可重用的app中,并且可重用的apps不能依赖于项目本身,因此您也不能直接导入app实例。 该@shared_task装饰器可以让你无需任何具体的app实例创建任务:
文件:app1/tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task
def xsum(numbers):
return sum(numbers)
调用任务,函数.delay(参数),示例如下:
from app1.tasks import add
res = add.delay(2, 3)
res.get()
附:官方完整示例代码:[https : //github.com/celery/celery/tree/master/examples/django/](https : //github.com/celery/celery/tree/master/examples/django/)
<h2 id=4>4.扩展</h2> #### django-celery-results 作用:**使用Django ORM/Cache作为结果存储。**
要将其用于项目,需要执行以下步骤:
- 安装django-celery-results库:
$ pip install django-celery-results
- 添加django_celery_results到Django项目的settins.py文件中的INSTALLED_APPS里:
INSTALLED_APPS = (
...,
''django_celery_results'',
)
注意:python模块名称是没有短划线的,只有下划线的。
- 通过执行数据库迁移来创建Celery数据库表:
$ python manage.py migrate celery_results
- 配置Celery以使用django-celery-results后端
# 如果使用的是Django settings.py配置Celery,添加以下设置:
CELERY_RESULT_BACKEND = ''django-db''
# 对于缓存后端,可以使用
CELERY_CACHE_BACKEND = ''django-cache''
django-celery-beat
作用:具有管理界面的数据库支持的定期任务
这个后期单独整理,详情参见官方文档
<h2 id=5>5.启动worker进程</h2> In a production environment you’ll want to run the worker in the background as a daemon - see Daemonization - but for testing and development it is useful to be able to start a worker instance by using the celery worker manage command, much as you’d use Django’s manage.py runserver
在生产环境中,你会想要在后台作为守护程序运行woerker, 详情参见官方文档系统守护进程
对于测试和开发环境,可以通过使用Celery worker 管理命令启动,就像Django的 manage.py runserver
:
# Linux 操作系统
# 首先,启动redis,省略
# 其次,启动Django项目,省略
# 最后,启动celery worker
$ celery -A 项目名称 worker -l info
# Windows 操作系统
redis-server.exe redis.windows.conf
python manage.py runserver
celery -A 项目名称 worker -l info -P eventlet
更多命令详解,使用help命令:
$ celery help
关于如何禁用Django Celery管理模块?和关闭django runserver的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Celery + Django:无法在Windows 7上启动celerybeat、Celery Django 在 previus 完成后运行定期任务 [django-celery-beat]、Celery Workers并没有全部用Django将事务写入数据库、Celery 与 Django等相关知识的信息别忘了在本站进行查找喔。
本文标签: