簡體   English   中英

如何將Tornado與APScheduler一起使用?

[英]How to use Tornado with APScheduler?

我正在運行python的apscheduler並且定期想要做一些工作POST到一些http資源,這將涉及使用tornado的AsyncHttpClient作為預定作業。 每個作業都會進行多次POST。 當每個http請求響應時,然后調用回調(我認為Tornado使用future來完成此操作)。

我關心線程安全,因為Apscheduler在各種線程中運行作業。 我無法找到一個很好的解釋示例,說明在這種情況下如何最好地在多個線程中使用龍卷風。

我怎樣才能以這種方式最好地使用tornado apscheduler

具體問題:

  1. 哪個龍卷風ioloop使用? 文檔說AsyncHTTPClient “像魔術一樣”。 好吧,魔法嚇到了我。 我是否需要在當前線程中使用AsyncHTTPClient ,還是可以使用主要的(可以指定)?

  2. 關於我使用的ioloop,我的回調是否存在線程安全問題?

  3. 我不清楚線程完成時會發生什么,但仍有一個待調用的回調/未來需要調用。 這里有問題嗎?

  4. 由於apscheduler作為線程在進程中運行,並且python具有GIL,那么從主線程獲得一個IOLoop幾乎是相同的 - 而不是來自不同線程的多個循環(關於性能)?

  1. 所有Tornado的實用程序都圍繞着Tornado的IOLoop工作 - 這也包括AsyncHTTPClient。 並且IOLoop不被認為是線程安全的。 因此,從運行主IOLoop的線程以外的任何線程運行AsyncHTTPClient並不是一個好主意。 有關如何使用IOLoop的更多詳細信息, 請閱讀此內容

  2. 如果你使用tornado.ioloop.IOLoop.instance() ,那么我想如果你的意圖是不向主線程的IOLoop添加回調。 您可以使用tornado.ioloop.IOLoop.current()為正確的線程正確引用正確的IOLoop實例。 並且你將不得不做太多的書籍保持從另一個非主線程的IOLoop向非主線程的IOLoop添加回調 - 它會變得太亂。

  3. 我不太懂。 但我理解它的方式有兩種情況。 要么你在談論一個有IOLoop的線程,要么沒有IOLoop。 如果線程沒有運行IOLoop,那么在線程完成任何操作之后,IOLoop必須在其他一些線程(可能是主線程)中執行任何回調。 另一種情況是您正在談論的線程正在運行IOLoop。 除非你停止了IOLoop,否則線程將無法完成。 因此,回調的執行將取決於何時停止IOLoop。

  4. 老實說,我沒有看到使用Tornado線程的重點。 除非你在PyPy上運行,否則不會有任何性能提升,我不確定Tornado是否能很好地運行(並非所有已知的東西都可以使用它,老實說我也不知道Tornado)。 如果它是Web服務器並且使用Nginx作為代理和LB,您可能還有Tornado應用程序的多個進程。 既然你帶了一個apscheduler ,我會建議你使用IOLoop的add_timeout ,這幾乎和你需要的東西完全相同,它是Tornado的原生,它可以更好地使用它。 回調很難調試。 將它與Python的線程相結合,你可能會陷入巨大的混亂。 如果您准備考慮另一個選項,只需將所有異步處理移出此過程 - 它將使生活變得更加容易。 想想像芹菜這樣的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM