1. 程式人生 > >Python-模組和包.深入Celery之子任務及原語組式/鏈式/回撥

Python-模組和包.深入Celery之子任務及原語組式/鏈式/回撥

子級任務:

說明: 前面學習的任務呼叫基本上已夠用,但有時業務場景可能需要任務關聯,且子任務可能需要父任務為其傳遞一些必要引數,此時可通過func.subtask或簡寫func.s實現,子任務物件依然可以呼叫任務物件的API,delay和apply_async,但和常規呼叫不同的是子任務呼叫時傳遞的引數加生成子任務時初始化引數的才是最終任務的引數,所以子任務在呼叫時就不需要再重複傳遞子任務初始化時的引數了.

1

2

3

4

5

6

7

>>> mail = send_mail.subtask(('sub''msg'), countdown=1)

>>> mail.delay(

'limanman')

<AsyncResult: de491985-5170-43c3-905f-f899f3aef460>

>>> mail = send_mail.s('sub''msg', countdown=1)

>>> mail.delay('limanman')

<AsyncResult: c67194e0-16e1-47a8-a4bb-420f4966b7f1>

注意: send_mail.subtask(('sub', 'msg'), countdown=1)或send_mail.s('sub', 'msg', countdown=1)返回的是Signature物件,此物件攜帶生成子任務時的引數,且可呼叫任務物件的API,當呼叫時,傳遞的引數被提前.

原語操作:

# 使組式:

1

2

3

>>> from celery import group

>>> group(send_mail.s(i, i, i) for in xrange(10))().get()

>>> group(send_mail.s('msg_{0}'.format(i)) for in xrange(10))('usr''sub').get()

說明: group內部使用列表生成式生成了10個子任務,生成時且提供了一個引數,當呼叫group('usr', 'sub')時其實是遍歷group內部的所有子任務呼叫其.delay('usr', 'sub'),所以是併發非同步執行的,上面說過,呼叫時傳遞的引數會被提前,所以其實最終的引數順序是'usr', 'sub', 'msg_{0}'.format(i),非同步返回的是GroupResult物件,如果要獲取每個子任務的結果,可通過同步阻塞的get方法獲取.

# 使鏈式:

1

2

3

4

5

>>> from celery import chain

>>> result = chain(add.s(2) | add.s(1))(5)

>>> result.get()

>>> result.parent.get()

>>> result.parent.parent.get()

說明: chain內部兩個鏈式子任務,|表示前一個的輸出作為另一個的輸入,當呼叫chain(...)(5)時,其實是首先呼叫add.s(2).delay(5)計算出結果為7,然後|傳遞作為add.s(1)的輸入,其實是呼叫add.s(1).delay(7)

計算出結果為8,非同步返回的是AsyncResult物件,可通過同步阻塞的get方法獲取,鏈式操作還有一個特別的地方可通過result.parent.get()獲取上層結果.

# 使回撥:

1

2

3

>>> from celery import chain group chord

>>> chord((send_mail.s('usr_{0}'.format(i), 'sub_{0}'.format(i), 'msg_{0}'.format(i)) for in xrange(10)), send_mail.s('sub''msg'))().get()

>>> chain(group(send_mail.s('usr_{0}'.format(i), 'sub_{0}'.format(i), 'msg_{0}'.format(i)) for in xrange(10))|send_mail.s('sub''msg'))().get()

說明: chord和group類似,只是在此基礎上加了個回撥,當呼叫get方法時會對,第一個引數必須是一個包含子任務的可迭代物件,第二個為可回撥函式或方法,會自動接收提前引數,其實用chain和group也可以利用如上方式實現類似回撥.

原文轉自:樂搏學院http://www.learnbo.com/

相關推薦

Python-模組.深入Celery任務//

子級任務: 說明: 前面學習的任務呼叫基本上已夠用,但有時業務場景可能需要任務關聯,且子任務可能需要父任務為其傳遞一些必要引數,此時可通過func.subtask或簡寫func.s實現,子任務物件依然可以呼叫任務物件的API,delay和apply_async,但和常規呼叫

模組.深入Celery節點管理/任務排程/任務追蹤

任務管理: 說明: 如上為執行任務後的標準輸出,transport為訊息代理,concurrency為預設程序池程序數,當所有子程序處於忙碌狀態時必須等待空閒子程序處理,如果是IO密集型可嘗試使用Eventlet/Gevent協程,具體可參考http://docs.jin

python-模組

模組:1. 一個py檔案,就是一個模組,檔案中包括定義的函式和類等資訊。2. 儘管可以import多次,實際上模組只匯入一次3. 模組搜尋路徑 記憶體中已經載入的模組->內建模組->sys.path路徑(導模組的環境變數)中包含的模組 4. 匯入模組      將

python模組

1. 模組 1.1 模組的概念 模組是 Python 程式架構的一個核心概念 每一個以副檔名 py 結尾的 Python 原始碼檔案都是一個 模組 模組名 同樣也是一個 識別符號,需要符合識別符號的命名規則 在模組中定義的 全域性變數 、函式、類 都是提供給

python路---25 模組

一.模組   1.匯入方式     自己建立的模組名稱 切不可和 內建模組的一樣    ①  import  模組      ②  import 模組 as  名      設定在此空間的名稱  

Python基礎---模組

模組 概念:     模組和java中的包概念類似 匯入:     關鍵字  import    import 模組名... 部分匯入:   關鍵字 from    from 模組名 import 函

python常用模組(模組的解釋,time模組,sys模組,random模組,os模組,jsonpickle序列化模組)

1.1模組 什麼是模組: 在計算機程式的開發過程中,隨著程式程式碼越寫越多,在一個檔案裡程式碼就會越來越長,越來越不容易維護。 為了編寫可維護的程式碼,我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的程式碼就相對較少,在python中。一個.py檔案就稱為一個模組(Module

python模組機制:importfrom..import..

一. 兩個概念: 1.module A module is a file containing Python definitions and statements. 所以module就是一個.py檔案 2.package Packages are a way of str

python中的模組

1.模組模組(module)是搭建程式的一種方式。每一個Python程式碼檔案都是一個模組。2.模組的匯入(1)import格式:import 模組名使用格式: 模組名.類名 或者 全域性變數名 或者 函式名(2)from…import格式:from 模組名 import 類

Python模組的理解

iamlaosong文 學習Python語言,對模組和包的理解總結如下: 1、模組(Module)就是包含程式碼的檔案,不一定是Python程式碼,有四種程式碼型別的模組: •使用Python寫的程式

Python進階筆記(3)_ 模組

匯入模組 要使用一個模組,我們必須首先匯入該模組。Python使用import 語句匯入一個模組。例如,匯入系統自帶的模組 math:import math 你可以認為 math 就是一個指向已匯入模組的變數,通過該變數,我們可以訪問 math 模組中所定義的所有公開的函式

Python怎麼用pip安裝模組

import numpy as np解決“ModuleNotFoundError: No module named'tensorflow/numpy'”問題1. 找到python pip安裝路徑,一般在x:\Python\Script路徑下2. 開啟cmd命令視窗,將pip主

Python 命令列旅:深入 click 命令篇

作者:HelloGitHub-Prodesire HelloGitHub 的《講解開源專案》系列,專案地址:https://github.com/HelloGitHub-Team/Article 一、前言 在上兩篇文章中,我們介紹了 click 中的”引數“和“選項”,本文將繼續深入瞭解 clic

Python_從零開始學習_(44) 模組

目錄   1.  模組 1.1  模組的概念 1.2  模組的兩種匯入方式 1.3  模組的搜尋順序(擴充套件) 1.4  原則 ---- 每一個檔案都應該是可以被匯入的 2.  包 (package)

python模組揭祕

python模組揭祕 簡介 模組是最高級別的程式組織單元,它將程式程式碼和資料封裝起來以便重用。類似於c語言中include進來的標頭檔案。在python中,每一個檔案就是一個模組,並且模組匯入其它模組之後就可以使用匯入模組定義的變數名。 為什麼引入

深入Celery使用佇列以及優先順序提高響應

多個佇列: Celery預設使用的佇列名為celery預設繫結在direct交換機celery,可通過CELERY_DEFAULT_QUEUE/CELERY_DEFAULT_EXCHANGE/CELERY_DEFAULT_ROUTING_KEY等引數配置修改. 1 2

day30-模組

一、模組介紹 1、什麼是模組 在python中,一個函式封裝一個功能,當一個檔案中包含很多個函式,而我們在其他程式中經常會用到這個檔案中的功能時,那麼我們就可以將這個包含多個函式的檔案封裝成一個模組,供其他程式來引用。簡單來說,一個模組就一系列常用功能函式的集合體,一個.py檔案就是一個模組。 模組分三

day33 Pyhton logging 模組

一內容回顧   try/except   try/except/else   try/finally   try/except   try/except/finally   try/except/else/finally 報錯的時候   1檢查程式邏輯是不是有問題   2.邏輯沒有問題,但是

6、模組的匯入

一、模組匯入的方式:        方式一:import  模組名         使用時:模組名.函式名()     方式二 :from 模組名 import  函式名         使用時:函式名()     方式三: from 模組名 import *

Node中模組

一、模組和包 概念:模組(Module)和包(Package)是Node.js最重要的支柱。開發一個具有一定規模的程式不可能只用一個檔案,通常需要把各個功能拆分、分裝、然後組合起來。模組正式為了實現這種方式而誕生,在瀏覽器JavaScript中,指令碼模組的拆分和組合通