celerypython
㈠ python Celery 中每一個任務只會落到一個 worker 上嗎
python自己沒有array這個數據結構。
據我所知array是python的numpy工具包定義的。 python的list就是常說的列表。
array和list主要的不同是,因為numpy是一個數值計算工具包,numpy的很多函數是可以直接在array上使用的,但不能用在list上。
㈡ Django配置Celery執行非同步和同步任務(tasks))
celery是一個基於python開發的簡單、靈活且可靠的分布式任務隊列框架,支持使用任務隊列的方式在分布式的機器/進程/線程上執行任務調度。採用典型的生產者-消費者模型,主要由三部分組成:
比如系統上線前後台批量導入歷史數據,發送簡訊、發送郵件等耗時的任務
1.安裝RabbitMQ,這里我們使用RabbitMQ作為broker,安裝完成後默認啟動了,也不需要其他任何配置
Ubuntu linux安裝
CentOS Linux 安裝
蘋果mac 安裝需要配置
配置環境變數 (蘋果用戶)
啟動rabbitmq-server
2.安裝celery
3.celery用在django項目中,django項目目錄結構(簡化)如下
4.創建 oa/celery.py 主文件
5.在 oa/__init__.py 文件中增加如下內容,確保django啟動的時候這個app能夠被載入到
6.各應用創建tasks.py文件,這里為 users/tasks.py
7.views.py中引用使用這個tasks非同步處理
8.啟動celery
9.這樣在調用post這個方法時,里邊的add就可以非同步處理了
定時任務的使用場景就很普遍了,比如我需要定時發送報告給老闆~
1. oa/celery.py 文件添加如下配置以支持定時任務crontab
3.啟動celery beat,celery啟動了一個beat進程一直在不斷的判斷是否有任務需要執行
㈢ Celery定義了定時任務函數後,在哪寫調用執行函數(要定時跑的代碼)
運行 worker
celery -A proj worker -l info
運行 app
python manage.py runserver 0.0.0.0:8000
然後你打開瀏覽器的地址
輸入剛才的賬號密碼就可以了。
㈣ celery python 好用嗎
為什麼要使用celery
Celery是一個使用Python開發的分布式任務調度模塊,因此對於大量使用Python構建的系統,可以說是無縫銜接,使用起來很方便。Celery專注於實時處理任務,同時也支持任務的定時調度。因此適合實時非同步任務定時任務等調度場景。Celery需要依靠RabbitMQ等作為消息代理,同時也支持Redis甚至是Mysql,Mongo等,當然,官方默認推薦的是RabbitMQ。
broker的選擇
雖然官方支持的broker有很多,包括RabbitMQ,Redis甚至是資料庫,但是不推薦使用資料庫,因為資料庫需要不斷訪問磁碟,當你的任務量大了之後會造成很嚴重的性能問題,同時你的應用很可能也在使用同一個資料庫,這樣可能導致你的應用被拖垮。如果業務環境比較簡單可以選擇Redis,如果比較復雜選擇RabbitMQ,因為RabbitMQ是官方推薦的,但是比Redis操作起來又相對復雜些。我的選擇是broker用RabbitMQ,backend用Redis
希望能幫到你!
㈤ python3.7 中使用django-celery 完成非同步任務
python 虛擬環境管理工具
錯誤提出及討論:
解決方案:
運行 python manage.py celery worker -l INFO 時報錯:
參考:
解決方案:
說明:這是因為在 python 3.7 中將 async 作為了關鍵字,所以當 py 文件中出現類似 from . import async, base 這類不符合python語法的語句時,Python會報錯。
解決:
㈥ Python Celery 中每一個任務只會落到一個 worker 上嗎
由於線程安全問題,python在設計之初,就註定了只能在單CPU上運行。
Celery注冊的任務為python模塊,也就是說實際還是運行python代碼,所以只能一個worker來執行。
㈦ php怎麼調用celery任務
任務隊列是一個將工作分布到多線程或多台機器上的機制。
一個任務隊列的輸入是一個工作單元也被稱為任務。專用的工作者進程將會持續監控任務隊列並執行它們。
Celery通過消息進行通信,通常通過一個中間人在客戶端和工作者之間協調。客戶端初始化一個任務並將它加到任務隊列,中間人將其發送到工作者。
一個Celery系統可以由多個工作者和中間人構成,這為高可用性和橫向擴展提供了便利。
Celery是用python語言實現的,但是可以使用任何語言實現其協議。除了python以外,還有node.js實現的node-celery和一個php實現的客戶端。
node-celery for Node.js, and a PHP client.
不同語言之間可以相互操作,通過使用webhooks.using webhooks.
㈧ 如何用 Python 構建一個簡單的分布式系統
分布式爬蟲概覽
何謂分布式爬蟲?
通俗的講,分布式爬蟲就是多台機器多個
spider
對多個
url
的同時處理問題,分布式的方式可以極大提高程序的抓取效率。
構建分布式爬蟲通暢需要考慮的問題
(1)如何能保證多台機器同時抓取同一個URL?
(2)如果某個節點掛掉,會不會影響其它節點,任務如何繼續?
(3)既然是分布式,如何保證架構的可伸縮性和可擴展性?不同優先順序的抓取任務如何進行資源分配和調度?
基於上述問題,我選擇使用celery作為分布式任務調度工具,是分布式爬蟲中任務和資源調度的核心模塊。它會把所有任務都通過消息隊列發送給各個分布式節點進行執行,所以可以很好的保證url不會被重復抓取;它在檢測到worker掛掉的情況下,會嘗試向其他的worker重新發送這個任務信息,這樣第二個問題也可以得到解決;celery自帶任務路由,我們可以根據實際情況在不同的節點上運行不同的抓取任務(在實戰篇我會講到)。本文主要就是帶大家了解一下celery的方方面面(有celery相關經驗的同學和大牛可以直接跳過了)
Celery知識儲備
celery基礎講解
按celery官網的介紹來說
Celery
是一個簡單、靈活且可靠的,處理大量消息的分布式系統,並且提供維護這樣一個系統的必需工具。它是一個專注於實時處理的任務隊列,同時也支持任務調度。
下面幾個關於celery的核心知識點
broker:翻譯過來叫做中間人。它是一個消息傳輸的中間件,可以理解為一個郵箱。每當應用程序調用celery的非同步任務的時候,會向broker傳遞消息,而後celery的worker將會取到消息,執行相應程序。這其實就是消費者和生產者之間的橋梁。
backend:
通常程序發送的消息,發完就完了,可能都不知道對方時候接受了。為此,celery實現了一個backend,用於存儲這些消息以及celery執行的一些消息和結果。
worker:
Celery類的實例,作用就是執行各種任務。注意在celery3.1.25後windows是不支持celery
worker的!
procer:
發送任務,將其傳遞給broker
beat:
celery實現的定時任務。可以將其理解為一個procer,因為它也是通過網路調用定時將任務發送給worker執行。注意在windows上celery是不支持定時任務的!
下面是關於celery的架構示意圖,結合上面文字的話應該會更好理解
由於celery只是任務隊列,而不是真正意義上的消息隊列,它自身不具有存儲數據的功能,所以broker和backend需要通過第三方工具來存儲信息,celery官方推薦的是
RabbitMQ和Redis,另外mongodb等也可以作為broker或者backend,可能不會很穩定,我們這里選擇Redis作為broker兼backend。
實際例子
先安裝celery
pip
install
celery
我們以官網給出的例子來做說明,並對其進行擴展。首先在項目根目錄下,這里我新建一個項目叫做celerystudy,然後切換到該項目目錄下,新建文件tasks.py,然後在其中輸入下面代碼
這里我詳細講一下代碼:我們先通過app=Celery()來實例化一個celery對象,在這個過程中,我們指定了它的broker,是redis的db
2,也指定了它的backend,是redis的db3,
broker和backend的連接形式大概是這樣
redis://:password@hostname:port/db_number
然後定義了一個add函數,重點是@app.task,它的作用在我看來就是將add()
注冊為一個類似服務的東西,本來只能通過本地調用的函數被它裝飾後,就可以通過網路來調用。這個tasks.py中的app就是一個worker。它可以有很多任務,比如這里的任務函數add。我們再通過在命令行切換到項目根目錄,執行
celery
-A
tasks
worker
-l
info
啟動成功後就是下圖所示的樣子
這里我說一下各個參數的意思,-A指定的是app(即Celery實例)所在的文件模塊,我們的app是放在tasks.py中,所以這里是
tasks;worker表示當前以worker的方式運行,難道還有別的方式?對的,比如運行定時任務就不用指定worker這個關鍵字;
-l
info表示該worker節點的日誌等級是info,更多關於啟動worker的參數(比如-c、-Q等常用的)請使用
celery
worker
--help
進行查看
將worker啟動起來後,我們就可以通過網路來調用add函數了。我們在後面的分布式爬蟲構建中也是採用這種方式分發和消費url的。在命令行先切換到項目根目錄,然後打開python交互端
from
tasks
import
addrs
=
add.delay(2,
2)
這里的add.delay就是通過網路調用將任務發送給add所在的worker執行,這個時候我們可以在worker的界面看到接收的任務和計算的結果。
這里是非同步調用,如果我們需要返回的結果,那麼要等rs的ready狀態true才行。這里add看不出效果,不過試想一下,如果我們是調用的比較占時間的io任務,那麼非同步任務就比較有價值了
上面講的是從Python交互終端中調用add函數,如果我們要從另外一個py文件調用呢?除了通過import然後add.delay()這種方式,我們還可以通過send_task()這種方式,我們在項目根目錄另外新建一個py文件叫做
excute_tasks.py,在其中寫下如下的代碼
from
tasks
import
addif
__name__
==
'__main__':
add.delay(5,
10)
這時候可以在celery的worker界面看到執行的結果
此外,我們還可以通過send_task()來調用,將excute_tasks.py改成這樣
這種方式也是可以的。send_task()還可能接收到為注冊(即通過@app.task裝飾)的任務,這個時候worker會忽略這個消息
定時任務
上面部分講了怎麼啟動worker和調用worker的相關函數,這里再講一下celery的定時任務。
爬蟲由於其特殊性,可能需要定時做增量抓取,也可能需要定時做模擬登陸,以防止cookie過期,而celery恰恰就實現了定時任務的功能。在上述基礎上,我們將tasks.py文件改成如下內容
然後先通過ctrl+c停掉前一個worker,因為我們代碼改了,需要重啟worker才會生效。我們再次以celery
-A
tasks
worker
-l
info這個命令開啟worker。
這個時候我們只是開啟了worker,如果要讓worker執行任務,那麼還需要通過beat給它定時發送,我們再開一個命令行,切換到項目根目錄,通過
這樣就表示定時任務已經開始運行了。
眼尖的同學可能看到我這里celery的版本是3.1.25,這是因為celery支持的windows最高版本是3.1.25。由於我的分布式微博爬蟲的worker也同時部署在了windows上,所以我選擇了使用
3.1.25。如果全是linux系統,建議使用celery4。
此外,還有一點需要注意,在celery4後,定時任務(通過schele調度的會這樣,通過crontab調度的會馬上執行)會在當前時間再過定時間隔執行第一次任務,比如我這里設置的是60秒的間隔,那麼第一次執行add會在我們通過celery
beat
-A
tasks
-l
info啟動定時任務後60秒才執行;celery3.1.25則會馬上執行該任務
㈨ Celery 簡介
任務隊列是一種把任務通過線程或機器進行分發的機制,輸入是一個工作單元--任務,工作進程則不斷地檢查任務隊列來執行新任務。
celery使用消息來通信,通常需要中間件中轉。流程為:客戶端添加消息到隊列來初始化一個任務,然後消息隊列系統把消息分發給工作進程。
celery可以包含多個工作進程和消息隊列系統,來保證高可用性和進行水平擴展。
雖然celery是python實現的,仍可輕松實現其他語言的客戶端,如php js,或可可使用webhooks來交互。
可在單台機器、多台機器、集群中運行
需要py2.7+ 不支持win
需要rabbitmq或redis作為消息中間件
不需要配置文件
工作進程和客戶端在連接丟失或失敗時會自動重試,一些支持HA的消息系統可以做主主、主從擴展
每分鍾處理幾百萬任務,通過使用RabbitMQ librabbitmq 和 一些優化設置,可使得rtt為亞毫秒級
它的每一部分都可以靈活地擴展(自定義的pool,序列化方式,壓縮,日誌,定時任務,消費者,生產者,中間件)
redis rabbitmq
redis amqp memcached orm apache-Cassandra ES
fork eventlet gevent 單線程
pickle json yaml 另支持壓縮 簽名 加密
㈩ Python 非同步任務隊列Celery 使用
在 Python 中定義 Celery 的時候,我們要引入 Broker,中文翻譯過來就是「中間人」的意思。在工頭(生產者)提出任務的時候,把所有的任務放到 Broker 裡面,在 Broker 的另外一頭,一群碼農(消費者)等著取出一個個任務准備著手做。這種模式註定了整個系統會是個開環系統,工頭對於碼農們把任務做的怎樣是不知情的。所以我們要引入 Backend 來保存每次任務的結果。這個 Backend 也是存儲任務的信息用的,只不過這里存的是那些任務的返回結果。我們可以選擇只讓錯誤執行的任務返回結果到 Backend,這樣我們取回結果,便可以知道有多少任務執行失敗了。
其實現架構如下圖所示:
可以看到,Celery 主要包含以下幾個模塊:
celery可以通過pip自動安裝。
broker 可選擇使用RabbitMQ/redis,backend可選擇使用RabbitMQ/redis/MongoDB。RabbitMQ/redis/mongoDB的安裝請參考對應的官方文檔。
------------------------------rabbitmq相關----------------------------------------------------------
官網安裝方法: http://www.rabbitmq.com/install-windows.html
啟動管理插件:sbin/rabbitmq-plugins enable rabbitmq_management 啟動rabbitmq:sbin/rabbitmq-server -detached
rabbitmq已經啟動,可以打開頁面來看看 地址: http://localhost:15672/#/
用戶名密碼都是guest 。進入可以看到具體頁面。 關於rabbitmq的配置,網上很多 自己去搜以下就ok了。
------------------------------rabbitmq相關--------------------------------------------------------
項目結構如下:
使用前,需要三個方面:celery配置,celery實例,需執行的任務函數,如下:
Celery 的配置比較多,可以在 官方配置文檔: http://docs.celeryproject.org/en/latest/userguide/configuration.html 查詢每個配置項的含義。
當然,要保證上述非同步任務and下述定時任務都能正常執行,就需要先啟動celery worker,啟動命令行如下:
需 啟動beat ,執行定時任務時, Celery會通過celery beat進程來完成。Celery beat會保持運行, 一旦到了某一定時任務需要執行時, Celery beat便將其加入到queue中. 不像worker進程, Celery beat只需要一個即可。而且為了避免有重復的任務被發送出去,所以Celery beat僅能有一個。
命令行啟動:
如果你想將celery worker/beat要放到後台運行,推薦可以扔給supervisor。
supervisor.conf如下: