如何在非同步結果返回時進行跟蹤
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQLServer進行SQL跟蹤SQLServer
- celery筆記一之celery介紹、啟動和執行結果跟蹤筆記
- 一個非侵入式跟蹤分析程式
- 使用ErrorStack進行錯誤跟蹤及診斷Error
- 使用OpenCV進行ROS 2的循線跟蹤OpenCVROS
- MyBatis 返回結果MyBatis
- 利用errorstack事件進行錯誤跟蹤和診斷Error事件
- iOS FMDB有返回結果集和無返回結果集iOS
- 跟蹤執行命令T
- 如何在 Git 中取消檔案的跟蹤Git
- Mac好用的時間跟蹤器Mac
- 新增時--sqlserver資料庫跟蹤SQLServer資料庫
- Spring Cloud Sleuth 和 Zipkin 進行分散式跟蹤使用指南SpringCloud分散式
- 通用結果類用於返回響應結果
- Python返回多個結果Python
- springboot返回結果包裝統一返回格式Spring Boot
- 使用NTP原理進行時間同步
- JavaScript中Typeof返回的結果JavaScript
- CVPR 2019 | 驚豔的SiamMask:開源快速同時進行目標跟蹤與分割演算法演算法
- [20190126]從sqlplus執行結果返回bash shell變數.txtSQL變數
- 好用的時間跟蹤定時器:Eon Timer for Mac定時器Mac
- Timemator自動化時間跟蹤軟體
- 如何在Premiere Pro中建立和跟蹤蒙版及克隆教程REM
- ORDER對查詢結果進行排序排序
- 美國邊境官員測試區塊鏈進行證書跟蹤區塊鏈
- 全域性統一返回結果類
- 判斷 ORM 返回結果為空ORM
- SpringCloud FeignClient呼叫返回結果為null。SpringGCCloudclientNull
- goroutine併發執行多個任務並依次返回結果Go
- [20200818]12c 10046跟蹤時間戳.txt時間戳
- Timemator for Mac(自動化時間跟蹤軟體)Mac
- 如何在Python中保留異常裝飾器的堆疊跟蹤Python
- ?laravel8 中介軟體對處理返回結果或異常進行格式統一處理Laravel
- 如何做好專案進度監控與跟蹤
- sp_trace_setfilter sqlserver篩選跟蹤或跟蹤過濾FilterSQLServer
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- [鐵柱分享]第五期:如何在 Laravel Eloquent 中對 all() 的結果進行排序?Laravel排序