2015-04-16 81 views
-2

我有一個連續的數據流,來自一個套接字。Python發電機與線程

我需要對它們進行即時操作,而其他數據仍在進行中。

使用yield(發電機狀)還是線程更好?

謝謝

回答

1

最好是使用線程處理長時間運行的網絡(套接字)操作。如果您在主線程中完成任何活動(或從套接字接收輸入之後),這將特別有用。

發電機一般不用於網絡運行。

0

如果在處理接收數據的一部分的同時嘗試接收更多數據,則需要多線程。這與yield沒有任何關係,因爲在等待數據被接收的同時,yielding仍然會阻止您的同時處理。

2

這兩個工作。兩者都有他們的問題。

大衛比茲利很好地談到雙方的問題,並說明了它在這個PYCON 2015年的談話視頻: https://www.youtube.com/watch?v=MCs5OvhV9S4

簡短的總結是怎麼樣的:

  • 您可以使用兩臺發電機/協同例程或線程或多處理來完成您的工作
  • 如果有任何事情涉及純Python中的硬計算工作(像numpy這樣的C-Extension可以避免這種情況),那麼Python GIL會咬合你的協同例程/線程。
  • 只要你主要做I/O,這並不重要。如果工作量較大,則線程效果會更好,如果您的塊較小,則協調程序的效果會更好。如果您使用游泳池,例如從期貨模塊中,您可以調整並改變行爲。

很難說一般情況下效果最好,完全取決於您的工作量。

+0

謝謝你的答案。看大衛腳本是太棒了。 – arj