如何在非同步結果返回時進行跟蹤
apply_async()
方法提交任務,並使用
get()
方法獲取非同步任務的結果。但是,在等待結果返回時,我們最希望能夠跟蹤任務的進度,以及處理已完成任務的結果。
1、問題背景:
在多程序池中使用非同步方式提交多個函式作為任務並獲取結果時,通常難以確定每個函式任務對應的結果。本文探討了如何跟蹤非同步結果,以便能夠將每個結果與相應的函式任務聯絡起來。
2、解決方案:
使用工作函式包裝器:
工作函式包裝器可以將原始函式作為引數,並在其周圍新增額外的邏輯。當原始函式作為任務提交到多程序池時,工作函式包裝器會被呼叫,可以在其中捕獲任務的後設資料(如任務的索引、名稱等)。然後,當任務完成並返回結果時,可以在包裝器中將這些後設資料與結果一起儲存在一個字典或元組中。
使用回撥函式:
回撥函式是在任務完成時被呼叫的函式。在使用 apply_async 方法提交任務時,可以指定一個回撥函式。當任務完成時,回撥函式會被呼叫,並將任務的結果作為引數傳遞給回撥函式。在回撥函式中,可以將任務的後設資料和結果儲存在一個字典或元組中。
**使用 AsyncResult 物件:
AsyncResult 物件是 apply_async 方法返回的物件,它包含任務的後設資料和結果。在獲取任務結果時,可以使用 AsyncResult 物件來訪問任務的後設資料和結果。可以使用 AsyncResult 物件的 get 方法來獲取任務結果。
**使用多執行緒或者事件佇列來儲存結果:
在回撥函式中,儲存結果集合的變數是共享資源,但可能多個程序同時訪問,為避免競爭條件(race condition),可以使用執行緒安全的資料型別來儲存結果集合。
下面是一個示例程式碼,演示瞭如何使用上述解決方案之一來跟蹤非同步結果:
import multiprocessing
from multiprocessing import Pool
import time
def multiply( x, y):
time. sleep( 1)
return x * y
# 使用工作函式包裝器
def wrapped_multiply( x, y, task_index):
result = multiply( x, y)
return ( task_index, result)
def main():
# 建立一個多程序池
pool = multiprocessing. Pool()
# 提交任務
tasks = [( i, j) for i in range( 1, 11) for j in range( 1, 11)]
results = pool. map( wrapped_multiply, tasks)
# 列印結果
for result in results:
print( f"Task { result[ 0]} result: { result[ 1]} ")
if __name__ == "__main__":
main()
在上面的示例程式碼中,
wrapped_multiply
函式是一個工作函式包裝器,它將原始函式 multiply 作為引數,並在其周圍新增了額外的邏輯來捕獲任務的索引。然後,當任務完成並返回結果時,
wrapped_multiply
函式將任務的索引和結果儲存在一個元組中。
main
函式建立了一個多程序池,並將任務提交到多程序池。然後,
main
函式使用
pool.map
方法來獲取任務的結果。
pool.map
方法會將 tasks 序列中的每個任務提交到多程序池,並返回一個包含任務結果的列表。
最後,
main
函式列印每個任務的結果。
在上面的示例程式碼中,我們使用了工作函式包裝器來跟蹤非同步結果。同樣,你也可以使用回撥函式或 AsyncResult 物件來跟蹤非同步結果。
然後再我們在實際應用中,可以根據自身需要對回撥函式進行擴充套件,以處理任務結果的儲存、進度更新等操作。透過使用回撥函式,我們也可以在任務完成時自動觸發相關操作,從而更加方便地進行非同步任務的處理和跟蹤。
上面就是本文的全部內容,希望能夠幫助大家解決在使用多程序池時跟蹤非同步結果的問題。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3008201/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AJAX的同步返回結果值
- SQLServer進行SQL跟蹤SQLServer
- 對session進行跟蹤Session
- celery筆記一之celery介紹、啟動和執行結果跟蹤筆記
- MyBatis 返回結果MyBatis
- iOS FMDB有返回結果集和無返回結果集iOS
- 強制SQL在限定時間內返回結果SQL
- loop迴圈 長時間沒有返回結果OOP
- 一個非侵入式跟蹤分析程式
- 使用ErrorStack進行錯誤跟蹤及診斷Error
- 【MySQL】如何對SQL語句進行跟蹤(trace)?MySql
- 使用ErrorStack進行錯誤跟蹤及診斷!Error
- 使用DBMS_TRACE對PL/SQL進行跟蹤SQL
- 使用OpenCV進行ROS 2的循線跟蹤OpenCVROS
- 通用結果類用於返回響應結果
- 返回部分結果後,才報單行子查詢返回多行。
- 利用errorstack事件進行錯誤跟蹤和診斷Error事件
- 使用ErrorStack進行Oracle錯誤跟蹤及診斷ErrorOracle
- 使用ERRORSTACK進行錯誤跟蹤及診斷(轉)Error
- 跟蹤執行命令T
- 如何在 Git 中取消檔案的跟蹤Git
- 基於行跟蹤的ROWDEPENDENCIES實現資訊變化跟蹤
- JavaScript中Typeof返回的結果JavaScript
- Python返回多個結果Python
- oracle跟蹤事件(dump)總結Oracle事件
- 同步和非同步關注的是訊息通訊機制,阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態非同步
- 程式碼效能分析-Dottrace跟蹤程式碼執行時間
- ORDER對查詢結果進行排序排序
- 新增時--sqlserver資料庫跟蹤SQLServer資料庫
- Mac好用的時間跟蹤器Mac
- 動態返回結果的檢視
- 全域性統一返回結果類
- 【DB】使用SQL_TRACE進行資料庫診斷跟蹤SQL資料庫
- springboot返回結果包裝統一返回格式Spring Boot
- 使用NTP原理進行時間同步
- 透過 NTP 進行時鐘同步
- SQL SERVER 跟蹤標記總結SQLServer
- Oracle 開啟SQL跟蹤執行SET AUTOTRACE ON命令時出錯OracleSQL