2015-06-25 61 views
1

我想運行作業,但由於它們可能很長,我想知道它們在執行過程中的處理程度。也就是說,執行者會定期返回進度,而不會結束正在執行的工作。 我試圖用APScheduler做到這一點,但似乎調度器只能接收像EVENT_JOB_EXECUTED或EVENT_JOB_ERROR這樣的事件消息。從預定作業處理過程中獲得反饋

在執行器執行任務時,是否可以從執行器獲取信息?

在此先感謝!

+0

如果存在大循環,則可以迭代代表工作進度並打印的數字。或者,如果你想要一些可視化的東西,你可以用這個詞作爲畫布的長度,作爲你作品的進度條。 我不知道你是否可以用模塊來做,而不是創建畫布(或者打印),但是這種方式在不增加太多時間的情況下運行。 – ysearka

+0

@ysearka:執行者和調度器如何訪問相同的數字?執行者通常鎖定每個允許修改的對象。我是否必須爲每個作業創建一個對象,可以由執行者更新並由調度器讀取,然後讓調度員定期檢查該號碼,或者每次更新號碼時都有辦法告訴調度員? – petibonum

+0

如果您顯示一個最小的工作示範代碼,它可能會有所幫助。 [ask] – boardrider

回答

0

我認爲,在APScheduler中沒有特別的支持。這個要求對我來說很多次了,最好的解決方案將取決於你的需求。一些可能性:

工作狀態字典

最簡單的辦法是使用一個普通的Python字典。把關鍵作爲工作的關鍵,並確定你需要的任何狀態信息的價值。當然,如果您只同時運行每個作業的一個副本(max_instances=1),則此解決方案效果最佳。如果你的狀態信息需要一些結構,那麼我就是一個namedtuples的粉絲。然後,你要麼將字典保存爲一個邪惡的全局變量,要麼將它傳遞給每個工作函數。

雖然有一些缺點。狀態信息將永遠保留在字典中,除非您刪除它。如果在工作結束時將其刪除,則無法讀取「工作完成」狀態,否則必須確保無論監視狀態如何,都必須檢查並清除每項工作。當然,如果您擁有合理大小的一組作業/鍵,這當然不是什麼大問題。

自定義字典

如果你需要一些額外的功能,您可以按上述做,但子類字典(或UserDict中或MutableMapping,depending on what you want)。

Memcached的

如果你有,你可以使用memcached服務器,存儲在memcached中的狀態報告的偉大工程,因爲它們可以自動過期,他們應該是你的應用程序全局訪問。一個可能的小缺點是,如果內存不足,狀態信息可能會從memcached服務器中逐出,因此您無法保證信息可用。

一個更主要的缺點是,這確實需要你有一個memcached服務器可用。如果您可能有或沒有可用的,則可以使用dogpile.cache並選擇當時適合的後端。

別的東西

彼得的有關使用回調函數的評論是值得考慮的註釋。如果你知道你需要什麼樣的狀態信息,但是你不知道最終如何存儲或使用它,將封裝器傳遞給你的工作將使後面使用不同的後端變得容易。

儘管如此,請謹慎對待您的解決方案。如果你想要的是一個報告說「20/133項目處理」,一個簡單的字典可能就足夠了。