1. 程式人生 > >[Python]學習Celery

[Python]學習Celery

文件:

筆記:

  • Celery 對名字空間有較為嚴格要求,應該採用類似 Django 的以專案名開始的路徑,例如 proj.tasks.taskA
  • Celery的最簡單的訊息處理方式是採用預設的celery queue,direct exchange
  • Celery預設會建立一個程序池,其中worker程序數等於CPU核心數
  • 用TERM訊號結束後臺執行的Celery例項,即 kill -15 pid

Example 1

結合 Supervisor 寫了個後臺自動執行worker的Demo
類似 ping 伺服器,收到請求後,睡眠一段時間,然後返回響應資訊

Step 1 建立工程目錄

# 目錄結構如下,注意 client.py 和 test1 同級
test1\__init__.py
      celery.py
      celeryconfig.py
      tasks.py
client.py   # producer

Step 2 程式碼編寫

celeryconfig.py

BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost'

celery.py
建立app例項,進行配置

from __future__ import absolute_import

from
celery import Celery app = Celery('test1', include=['test1.tasks']) app.config_from_object('test1.celeryconfig') if __name__ == '__main__': app.start()

tasks.py

from __future__ import absolute_import

from test1.celery import app
import time
import random


@app.task
def ping
(seq, start):
delay = random.randint(0, 3) time.sleep(delay) ret = time.time() return '{0} - pong {1}, run {2} seconds'.format(seq, delay, ret-start)

client.py

import time

from test1 import tasks


def test():
    results = set(tasks.ping.delay(i, time.time()) for i in range(10))

    while results:
        for i in results:
            if i.ready():
                sav = i
                results.remove(i)
                print sav.get()
                break

test()

Step 3 測試執行

cd 到 test1 的父目錄,執行

celery -A test1 worker -l info
python client.py

成功執行則會看到類似以下輸出
1 - pong 0, run 0.00337100028992 seconds
2 - pong 1, run 1.00772404671 seconds
0 - pong 3, run 3.04080796242 seconds
3 - pong 3, run 3.00674390793 seconds
7 - pong 0, run 3.00365185738 seconds
5 - pong 2, run 3.00629997253 seconds
9 - pong 2, run 5.00392007828 seconds
4 - pong 3, run 6.00150322914 seconds
6 - pong 3, run 5.99989199638 seconds
8 - pong 2, run 7.99660491943 seconds

前面幾個任務的執行時間和睡眠時間一致,後面的程序執行時間更長,和 round-robin 的排程方式相符

Step 4 加入supervisor管理

如果使用虛擬環境,只需使用相應二進位制檔案的絕對路徑即可。
/etc/supervisor/test1.conf

[program:test1]
directory=/Users/apple/PycharmProjects/Fun
command=/Users/apple/.pyenv/versions/my-virtual-env-2.7.10/bin/celery -A test1 worker -l info

autostart=true
autorestart=true

startsecs=10

stdout_logfile=/Users/apple/test1.log
redirect_stderr=true

killasgroup=true

啟動 supervisor,用 supervisorctl 確認 test1正常執行。用 ps aux | grep python 應該可以看到多個worker程序。

執行 client.py 驗證。

————————————————————–

supervisorctl 中
stop + remove 可以移除一個被管理的程序
add program 加入一個曾管理過的程序
更多的指令用 ? command 即可檢視

相關推薦

[Python]學習Celery

文件: 筆記: Celery 對名字空間有較為嚴格要求,應該採用類似 Django 的以專案名開始的路徑,例如 proj.tasks.taskA Celery的最簡單的訊息處理方式是採用預設的celery queue,direct exchange

Python學習筆記 - day14 - Celery異步任務

mage 名稱 完成 異步消息 安裝 裝飾器 可能 一段 god Celery概述 關於celery的定義,首先來看官方網站: Celery(芹菜) 是一個簡單、靈活且可靠的,處理大量消息的分布式系統,並且提供維護這樣一個系統的必需工具。 簡單來看,是一個基於pytho

python學習之路(四)

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

python 學習方法

模塊 經驗 utili 交互 class 印象 www 進行 os.path 依據本人的學習經驗,我總結了下面十點和大家分享: 1)學好python的第一步。就是立即到www.python.org站點上下載一個python版本號。我建議剛開始學習的人,不要下載具有ID

Python學習筆記-2017.5.4

列表 lin 覆蓋範圍 復習 處理 pytho 內部 global txt 本文章記錄學習過程中的細節和心得: 復習所學課程: 1、文件的操作:   打開文件,對文件的操作打開方式有兩種:   第一種:      f = open("test.txt", "r")#以只讀

Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

ide out generate depth sku color ati cond with 1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/prin

Python學習:集合(set)

pythonpython的set和其他語言類似, 是一個無序不重復元素集, 基本功能包括關系測試和消除重復元素. 集合對象還支持union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算. sets 支持 x in s

Python學習筆記-基礎Day01

虛擬機 python 處理器 Python與其他語言的對比:C 和 Python、Java、C#對比C語言:代碼編譯得到機器碼,機器碼在處理器上直接執行。其他語言:代碼編譯得到字節碼,虛擬機執行字節碼並轉換成機器碼然後在處理器上執行Python之類的高級語言相對C語言開發效率較高,不需要開發者考慮

Python學習day13 Django 分頁/Session/Cookie

min art .post sso quest mit out -- asset Created on 2017年5月3日 第1課:上節作業簡介 鼠標放上表單後進入編輯模式-----需學習----CMDB裏會學到模態對話框裏--彈出對話框---對後臺進行操作---方式:1

Python學習筆記——叠代器和生成器

返回對象 node manual 通過 line 計數 bject repr 對象 1、手動遍歷叠代器   使用next函數,並捕獲StopIteration異常。 def manual_iter(): with open(‘./test.py‘) as f:

python學習——python介紹

檢查 運算 運行期 library java 統計分析 統計 drop 維護 一、python的簡要介紹   python的創始人吉多·範羅蘇姆(Guido van Rossum)。 python可以應用於眾多領域,如:數據分析、組件集成、網絡服務、圖像建理、數值計算和科學

python學習之-項目開發目錄規範

使用說明 可執行 程序說明 一行 python學習 規範 功能性 行程 -m 軟件目錄結構規範有什麽好處:  通過規範化,能夠更好的控制軟件結構,讓程序具有更高的可讀性。項目目錄組織結構如下: Foo/         # 項目名 --bin/     # 可執

Python學習:函數(function)

python編寫函數def是可執行的代碼。Python函數是有一個新的語句便攜的,即def。不像C這樣的編譯語言,def是一個可執行的語句,函數並不存在,知道Python運行了def後才存在。事實上,if語句、while語句升至是其他的 def中嵌套都是合法的。def創建一個函數對象,並將其賦值給某一變量名。

python 學習——串口操作

time spa range log col div pen pre code 1. 串口6收到什麽就打印什麽 import serial ser = serial.Serial(‘com6‘, 115200, timeout=0.05) print "ser.isOp

Python學習:作用域(namespace)

pythonPython作用域基礎Python有四個作用域:L(Local)本地也稱作局部作用域;E(Enclosing)閉包函數外的函數中;G(global)全局作用域;B(Built-in)內建作用域;變量可以在三個不同的地方分配:如果一個變量在def內賦值,它被定位在這個函數之內。如果一個變量在嵌套的d

python學習之 -- 數據序列化

單獨 get 多次 __main__ print lambda 字典 學習 module json / pickle 數據序列化序列化定義:把變量從內存中變成可存儲或傳輸的過程稱為序列化。反序列化:把變量內容從序列化的對象重新讀到內存裏稱為反序列胡。序列化模塊之--pick

python學習筆記

pythonpython數據類型python邏輯操作符身份操作符is比較操作符< > <= >= != ==成員操作符in not in邏輯運算符and or notpython學習筆記

Python 學習——高階函數 filter 和 sorted

dict 字符串排序 一個 大寫 bsp sort log 說話 blog filter filter函數顧名思義,篩選,通過調用函數進行篩選序列中的滿足函數的子項 以實例來說話: 過濾一個序列中所有的偶數,保留奇數 另如下,過濾掉一個序列中的所有空格以及

python學習-day6-生成器(generator)

expr 無法 color 循環調用 限制 10個 數列 例子 ner 一,列表生成式 ls = [i*i for i in range(10)]ls[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] ge = (i*i for i in range(

Python學習之__slots__屬性

self. 但是 name obj import print blog 網站 usr 在廖老師的網站上學習的__slots__屬性 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/5/14 1