2017-03-22 28 views
1

我有一個簡單的扭曲應用程序,我使用systemd服務運行,執行腳本,隨後執行.tac文件。使用雙絞線和系統處理緩存預熱

應用程序的結構爲JSON RPC端點(fastjsonrpc),內置到t.w.r.Resource,這在t.w.s.Site,並擔任t.a.i.TCPServer,整個事情包裝成一個t.a.Application。這工作正常。

我遇到麻煩的地方是當我嘗試在啓動時預熱緩存。這個預熱過程非常慢(約300秒),並使systemd超時並終止進程。增加超時並不是一個真正可行的選擇,因爲我不希望這會阻止系統啓動。

在Apache和wsgi中,在Flask上運行的單獨堆棧中使用類似的代碼。該服務器自動啓動,讓系統繼續運行,同時需要花費時間建立緩存。這種行爲對我來說很好。

我已經打過電話使用twrResource的設置功能中的以下的預熱功能:

reactor.callLater(1, ep.warmup, None) 

我還沒使用這種從systemd內進行審判,並從twistd來一直在測試它直接在命令行上。服務器按預期工作,但不再響應SIGINT(^ C)。刪除callLater是讓服務器響應SIGINT所需要的一切。

如果直接調用暖機功能(而不是通過callLater,即等待暖機完成時systemd放棄的安排),則生成的服務器也會繼續響應SIGINT。

  1. 有沒有更好的方法來處理這種長時間運行的熱身代碼?
  2. 爲什麼扭轉/反應堆不響應SIGINT?我在這裏錯過了什麼嗎?

回答

0

Twisted是單線程的事情。這聽起來像你的「緩存預熱」代碼阻止了300秒的反應堆。一個簡單的方法來解決這個問題將使用deferToThread讓它運行沒有阻止反應堆。

+0

我沒有問題,它阻止了300秒的反應堆,但我需要反應堆正常後響應。反應堆正常工作,否則不再響應SIGINT/SIGTERM,需要停止SIGKILL。 deferToThread不太可能適用於我,因爲我的緩存是非常複雜的python對象網絡。 –

+0

或者,您可以重寫「熱身」程序以返回延遲,從而定期對反應堆進行控制。我不確定這可能與您看到的信號行爲有關,但這是更好的方法。一種方法是僅使用@inlineCallbacks並在每次循環迭代中使用「yield」(如果它是循環的話)。 – meejah