在北京治疗白癜风需要多少钱 http://m.39.net/pf/bdfyy/
celery中的异步与定时任务区别:
异步:被动执行,只有用户在执行某一项操作时,需要执行的任务
定时:主动执行,不管用户是否有操作,在指定时间自动执行的任务
一个异步任务,在定时任务中被声明了,那么他就是一个定时任务
定时任务可以作为异步任务,被用户调用执行
本篇文章中,声明定时任务是在celery.py文件中,当启动任务时,会自动执行定时任务
所需模块django==3.1.4celery==5.0.5django-celery-beat==2.2.0django项目文件结构
已经将所需要的py文件添加到了目录中
MicInputSys├──inputsysapp│├───__init__.py│├───apps.py│├───models.py│├───tasks.py│├───views.py│├───migrations││└──__init__.py├──MicInputSys│├──__init__.py│├──asgi.py│├──celery.py│├──settings.py│├──urls.py│└──wsgi.py└──manage.pysettings.py中配置
settings.py文件在:MicInputSys/MicInputSys/settings.py
#配置celeryCELERY_BROKER_URL=redis://.0.0.1:/0#Broker配置,使用Redis作为消息中间件CELERY_RESULT_BACKEND=redis://.0.0.1:/0#BACKEND配置,这里使用redisCELERY_RESULT_SERIALIZER=json#结果序列化方案celery.py中配置
celery.py文件在:MicInputSys/MicInputSys/celery.py
#将下一个版本中更新的内容导入到当前版本中from__future__importabsolute_import,unicode_literalsimportosfromceleryimportCeleryfromdatetimeimporttimedeltafromcelery.schedulesimportcrontabos.environ.setdefault(DJANGO_SETTINGS_MODULE,MicInputSys.settings)#设置django环境app=Celery(MicInputSys)app.config_from_object(django.conf:settings,namespace=CELERY)#使用CELERY_作为前缀,在settings中写配置app.autodiscover_tasks()#发现任务文件每个app下的task.py#声明定时任务app.conf.beat_schedule={uinputsysapp_tasks_add:{#任务名,可以自定义"task":"inputsysapp.tasks.add",#任务函数"schedule":timedelta(seconds=30),#定时每30秒执行一次(从开启任务时间计算)#"args":(1,3),#传未定义的不定长参数#kwargs:({name:张三}),#传已定义的不定长参数},uinputsysapp_tasks_delete:{"task":"inputsysapp.tasks.delete","schedule":crontab(minute=*/1),#定时每1分钟执行一次(每分钟的0秒开始执行)#"args":(),#kwargs:(),},}__init__.py中配置
__init__.py文件在:MicInputSys/MicInputSys/__init__.py
#将下一个版本中更新的内容导入到当前版本中from__future__importabsolute_import,unicode_literalsfrom.celeryimportappascelery_app__all__=[celery_app]tasks.py添加任务
tasks.py文件在:MicInputSys/inputsysapp/tasks.py
from__future__importabsolute_import,unicode_literalsfromceleryimportshared_taskimportredisrc=redis.Redis(.0.0.1,)
shared_taskdefadd(*args,**kwargs):x,y=argsprint(kwargs[name])print(x,y)number=int(rc.get(number).decode(utf8))ifrc.get(number)else0number+=rc.set(number,number)print(number)shared_taskdefdelete(*args,**kwargs):number=int(rc.get(number).decode(utf8))ifrc.get(number)else0number-=rc.set(number,number)print(number)启动任务启动worker
celery-AMicInputSys.celeryworker-linfo#执行命令启动worker#命令行显示--------------celery
SHMPZDLv5.0.5(singularity)---*****-------*******----Windows-10-10.0.-SP-02-:59:54-***---*----**----------[config]-**----------.app:MicInputSys:0x23c26e79a30-**----------.transport:redis://.0.0.1:/0-**----------.results:redis://.0.0.1:/0-***---*---.concurrency:12(prefork)--*******----.taskevents:OFF(enable-Etomonitortasksinthisworker)---*****-------------------[queues].celeryexchange=celery(direct)key=celery[tasks]#下面是所有任务名,如果没有,则证明启动失败.inputsysapp.tasks.add.inputsysapp.tasks.delete[-02-:59:55,:INFO/MainProcess]Connectedtoredis://.0.0.1:/0[-02-:02:31,:INFO/MainProcess]mingle:searchingforneighbors[-02-:02:31,:INFO/SpawnPoolWorker-1]childprocesscallingself.run()[-02-:02:31,:INFO/SpawnPoolWorker-5]childprocesscallingself.run()[-02-:02:31,:INFO/SpawnPoolWorker-4]childprocesscallingself.run()[-02-:02:31,:INFO/SpawnPoolWorker-7]childprocesscallingself.run()[-02-:02:31,:INFO/SpawnPoolWorker-2]childprocesscallingself.run()[-02-:02:32,:INFO/SpawnPoolWorker-6]childprocesscallingself.run()[-02-:02:32,:INFO/SpawnPoolWorker-3]childprocesscallingself.run()[-02-:02:32,:INFO/SpawnPoolWorker-8]childprocesscallingself.run()[-02-:02:32,:INFO/SpawnPoolWorker-9]childprocesscallingself.run()[-02-:03:21,:INFO/MainProcess]Receivedtask:inputsysapp.tasks.add[b95-f-47af-94ba-dead49][-02-:03:21,:INFO/MainProcess]Receivedtask:inputsysapp.tasks.delete[bd33-c7bc-44c2-e-c54b77c35cee][-02-:03:21,:INFO/SpawnPoolWorker-1]Taskinputsysapp.tasks.add[b95-f-47af-94ba-dead49]succeededin0.016004s:None[-02-:03:21,:INFO/SpawnPoolWorker-5]Taskinputsysapp.tasks.delete[bd33-c7bc-44c2-e-c54b77c35cee]succeededin0.016004s:None启动beat
celery-AMicInputSysbeat-linfo#执行命令启动beat#命令行显示celerybeatv5.0.5(singularity)isstarting.__-...__-_LocalTime--02-:58:13Configuration-.broker-redis://.0.0.1:/0.loader-celery.loaders.app.AppLoader.scheduler-celery.beat.PersistentScheduler.db-celerybeat-schedule.logfile-[stderr]
%INFO.maxinterval-5.00minutes(s)[-02-:58:13,:INFO/MainProcess]beat:Starting...[-02-:58:15,:INFO/MainProcess]Scheduler:Sendingduetaskinputsysapp_tasks_add(inputsysapp.tasks.add)[-02-:58:45,:INFO/MainProcess]Scheduler:Sendingduetaskinputsysapp_tasks_add(inputsysapp.tasks.add)[-02-:59:00,:INFO/MainProcess]Scheduler:Sendingduetaskinputsysapp_tasks_delete(inputsysapp.tasks.delete)视图中执行异步任务在views.py中创建视图类,文件位置:MicInputSys/inputsysapp/views.py
fromrest_framework.responseimportResponsefromrest_framework.viewsimportAPIViewfrominputsysappimporttasksclassTestAPIView(APIView)defget(self,request)number=tasks.add.delay(1,3,name=aaa)print(number)#输出结果为task_id:0bfb-14bc-4ee9-b-af11fc#可以在redis中使用命令:getcelery-task-meta-TASK_ID,来查询结果#如:getcelery-task-meta-0bfb-14bc-4ee9-b-af11fcreturnResponse({code:,msg:异步任务调用成功})
django中简单的celery使用,如有疑问,欢迎留言!
预览时标签不可点收录于话题#个上一篇下一篇