2014-12-23 60 views
1

我已經實現了使用Twisted服務器程序。我正在使用twisted.protocols.basic.LineReceiver以及twisted.internet.protocol.ServerFactory爲多個客戶絞合線對服務器

我想讓每個連接到服務器的客戶端並行運行一組函數(我正在考慮使用多線程)。

我對這個問題使用twisted.internet.threads.deferToThread有些困惑。

  1. 爲此,我應該撥打 ServerFactory嗎?
  2. 扭曲線程,線程安全相對於競爭條件?
  3. 此前,我嘗試在我的服務器程序中使用multiprocessing,但它似乎不能與Twisted reactor一起使用,而deferToThread完成了這項工作。

我在想如何實施Twisted線程?他們不使用multiprocessing

回答

1
  • 之前,我想在我的服務器程序中使用多,但它似乎沒有與扭曲的反應器組合工作,而deferToThread做的工作。我想知道Twisted線程是如何實現的?他們不使用多處理?
  • 你沒有說你是否使用多的還是多線程版本多的多進程版本。

    你可以閱讀有關混合扭曲和多堆棧溢出,但:

    Mix Python Twisted with multiprocessing? Twisted network client with multiprocessing workers? is twisted incompatible with multiprocessing events and queues?

    (及以上)

    要回答這個問題的更短的部分 - 不, Twisted不使用stdlib multiprocessing包來實現其線程API。它使用stdlib threading模塊。

    1. 扭曲的線程是否相對於競態條件是線程安全的?

    這個問題的答案是上面的回答暗示:沒有。 「扭曲的線程」並不是真正的事情。 Twisted的線程API只是在STDLIB threading模塊之上的一層(這實際上只是POSIX線程(或什麼樣的相似,但不同的在Windows上)一個Python API。Twisted的線程API不神奇消除競爭條件的可能性(如果在扭曲的任何魔法,它是做某些事情的能力,同時不使用線程在所有 - 這有助於減少在你的程序中競爭條件的號碼,雖然它並沒有完全消除他們創造的可能性)。

    1. 我應該叫在ServerFactory爲此目的deferToThread

    我不太清楚這個問題的重點是什麼。您是否想知道您的ServerFactory子類中的方法是否是撥打deferToThread的最佳位置?這可能取決於您實施方法的細節。不過,它可能並沒有在整體上產生巨大的差異。如果你喜歡讓工廠向協議實例提供服務的模式 - 就去做吧。