日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Celery踩过的坑

發布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Celery踩过的坑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么要使用celery

Celery是一個使用Python開發的分布式任務調度模塊,因此對于大量使用Python構建的系統,可以說是無縫銜接,使用起來很方便。Celery專注于實時處理任務,同時也支持任務的定時調度。因此適合實時異步任務定時任務等調度場景。Celery需要依靠RabbitMQ等作為消息代理,同時也支持Redis甚至是Mysql,Mongo等,當然,官方默認推薦的是RabbitMQ。

broker的選擇

雖然官方支持的broker有很多,包括RabbitMQ,Redis甚至是數據庫,但是不推薦使用數據庫,因為數據庫需要不斷訪問磁盤,當你的任務量大了之后會造成很嚴重的性能問題,同時你的應用很可能也在使用同一個數據庫,這樣可能導致你的應用被拖垮。如果業務環境比較簡單可以選擇Redis,如果比較復雜選擇RabbitMQ,因為RabbitMQ是官方推薦的,但是比Redis操作起來又相對復雜些。我的選擇是broker用RabbitMQ,backend用Redis

celery不能用root用戶啟動問題 C_FORCE_ROOT environment

如果使用root用戶啟動celery會遇到下面的問題

Running a worker with superuser privileges when the worker accepts messages serialized with pickle is a very bad idea! If you really want to continue then you have to set the C_FORCE_ROOT environment variable (but please think about this before you do).

解決辦法:

from celery import Celery, platformsplatforms.C_FORCE_ROOT = True #加上這一行

任務重復執行

celery執行定時任務的時候遇到了重復執行的問題,當時是用redis做broker和backend。
官方文檔中有相關描述。

If a task is not acknowledged within the Visibility Timeout the task will
be redelivered to another worker and executed.

This causes problems with ETA/countdown/retry tasks where the time to execute exceeds the visibility timeout; in fact if that happens it will be executed again, and again in a loop.

So you have to increase the visibility timeout to match the time of the longest ETA you are planning to use.

Note that Celery will redeliver messages at worker shutdown, so having a long visibility timeout will only delay the redelivery of ‘lost’ tasks in the event of a power failure or forcefully terminated workers.

Periodic tasks will not be affected by the visibility timeout, as this is a concept separate from ETA/countdown.

You can increase this timeout by configuring a transport option with the same name:

BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 43200}

The value must be an int describing the number of seconds.

就是說當我們設置一個ETA時間比visibility_timeout長的任務時,每過一次 visibility_timeout 時間,celery就會認為這個任務沒被worker執行成功,重新分配給其它worker再執行。
解決辦法就是把 visibility_timeout參數調大,比我們ETA的時間差要大。celery本身的定位就主要是實時的異步隊列,對于這種長時間定時執行,支持不太好。
但是第二天依然重復執行了。。。

最后我的解決方法是在每次定時任務執行完就在redis中寫入一個唯一的key對應一個時間戳,當下次任務執行前去獲取redis中的這個key對應的value值,和當前的時間做比較,當滿足我們的定時頻率要求時才執行,這樣保證了同一個任務在規定的時間內只會執行一次。

使用不同的queue

當你有很多任務需要執行的時候,不要偷懶只使用默認的queue,這樣會相互影響,并且拖慢任務執行的,導致重要的任務不能被快速的執行。雞蛋不能放在同一個籃子里的道理大家都懂。
有一種簡單的方式設置queue

Automatic routing

The simplest way to do routing is to use the CELERY_CREATE_MISSING_QUEUES setting (on by default).

With this setting on, a named queue that is not already defined in CELERY_QUEUES will be created automatically. This makes it easy to perform simple routing tasks.

Say you have two servers, x, and y that handles regular tasks, and one server z, that only handles feed related tasks. You can use this configuration:

CELERY_ROUTES = {'feed.tasks.import_feed': {'queue': 'feeds'}}

With this route enabled import feed tasks will be routed to the “feeds” queue, while all other tasks will be routed to the default queue (named “celery” for historical reasons).

Now you can start server z to only process the feeds queue like this:

user@z:/$ celery -A proj worker -Q feeds

You can specify as many queues as you want, so you can make this server process the default queue as well:

user@z:/$ celery -A proj worker -Q feeds,celery

直接使用

CELERY_ROUTES = {'feed.tasks.import_feed': {'queue': 'feeds'}} user@z:/$ celery -A proj worker -Q feeds,celery

指定routes,就會自動生成對應的queue,然后使用-Q指定queue啟動celery就可以,默認的queue名字是celery。可以看官方文檔對默認queue的名字進行修改。

啟動多個workers執行不同的任務

在同一臺機器上,對于優先級不同的任務最好啟動不同的worker去執行,比如把實時任務和定時任務分開,把執行頻率高的任務和執行頻率低的任務分開,這樣有利于保證高優先級的任務可以得到更多的系統資源,同時高頻率的實時任務日志比較多也會影響實時任務的日志查看,分開就可以記錄到不同的日志文件,方便查看。

$ celery -A proj worker --loglevel=INFO --concurrency=10 -n worker1.%h $ celery -A proj worker --loglevel=INFO --concurrency=10 -n worker2.%h $ celery -A proj worker --loglevel=INFO --concurrency=10 -n worker3.%h

可以像這樣啟動不同的worker,%h可以指定hostname,詳細說明可以查看官方文檔
高優先級的任務可以分配更多的concurrency,但是并不是worker并法數越多越好,保證任務不堆積就好。

是否需要關注任務執行狀態

這個要視具體的業務場景來看,如果對結果不關心,或者任務的執行本身會對數據產生影響,通過對數據的判斷可以知道執行的結果那就不需要返回celery任務的退出狀態,可以設置

CELERY_IGNORE_RESULT = True

或者

@app.task(ignore_result=True) def mytask(…):something()

但是,如果業務需要根據任務執行的狀態進行響應的處理就不要這樣設置。

內存泄漏

長時間運行Celery有可能發生內存泄露,可以像下面這樣設置

CELERYD_MAX_TASKS_PER_CHILD = 40 # 每個worker執行了多少任務就會死掉

作者:李俊偉_
鏈接:https://www.jianshu.com/p/9e422d9f1ce2
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

總結

以上是生活随笔為你收集整理的使用Celery踩过的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜av成人 | av三级在线播放 | 我爱我色成人网 | 色姑娘久 | 亚洲一级网| 国产精品免费久久久久 | jizz成熟丰满日本少妇 | 免费网站观看www在线观看 | 97欧美视频 | 99国产精品白浆在线观看免费 | 一区二区三区四区免费视频 | 日本性爱动漫 | 国产精品免费一区二区三区都可以 | 免费福利视频在线观看 | 亚洲天堂成人av | 草草久久久 | 永久免费未满蜜桃 | 成人av手机在线观看 | 免费69视频 | 色姑娘天天操 | 91挑色| 美女视频91 | 国产超碰在线观看 | 九九精品在线观看视频 | 国产精品自拍视频一区 | 国产美女作爱视频 | 三级视频小说 | 亚洲国产精品午夜久久久 | www青青草 | 91午夜交换视频 | 亚洲视频在线观看一区 | 亚洲免费中文字幕 | 成熟的女同志hd | 日韩一级免费视频 | 国产美女免费网站 | 亚洲AV无码久久精品色三人行 | 国产盗摄av | 国产性猛交xxxx免费看久久 | 国产美女流白浆 | 蜜桃成人无码区免费视频网站 | 日韩三级视频在线 | 另类视频在线观看+1080p | 中文字幕一区二区av | 国产熟女一区二区三区四区 | 日韩欧美国产电影 | 一级在线免费视频 | 久久成人a毛片免费观看网站 | 欧美日本综合 | 国产一区二区三区黄片 | 国内老熟妇对白xxxxhd | 亲切的金子片段 | 五月婷婷网站 | 婷婷色基地 | 一区二区三区久久久 | 国产精品福利电影 | 看了让人下面流水的视频 | 一区二区视频播放 | 国产精品人人妻人人爽人人牛 | 国产成人精品一区二区三区网站观看 | 日本免费不卡一区二区 | 免费看黄禁片 | 台湾av在线播放 | 亚洲视频精品 | 久久在线电影 | 成人久久毛片 | 又色又爽又黄18网站 | 国产精品美女久久 | 国产视频一区二区在线播放 | 欧美在线观看一区 | 久久艹国产 | 五十路毛片 | 黑人大群体交免费视频 | 秋霞欧美在线观看 | 色99色| 日本高清视频www夜色资源 | 欧美激情999 | 超碰狠狠干 | 精品人妻中文无码av在线 | 日本xxxx免费 | 国产一级黄色 | 特级特黄刘亦菲aaa级 | 国产av无码专区亚洲av毛片搜 | 亚洲第一自拍 | 7777av| 午夜精品视频一区 | 国产高清一级 | 国产亚洲毛片 | 欧美日韩成人在线视频 | 一区二区久久久 | 天天干视频在线 | 免费国产成人 | 你懂的在线观看网站 | 内射中出日韩无国产剧情 | 久草网在线视频 | 日本少妇激三级做爰在线 | 国产精品国色综合久久 | 成年人黄色小视频 | 91看视频| 国产69精品久久久久777 |