[英]When does it make sense to use threads
我在弄清楚使用線程作為正在構建的解決方案是否有意義還是應該保留它的位置方面遇到了麻煩。 我有一個腳本( manager.py
),該腳本調用另一個腳本( sniff.py
)嗅探網絡數據包,並調用另一個( parse.py
)解析嗅探到的數據包。
manager.py腳本僅用於觸發應用程序。 對於每個收到的數據包,嗅探器將對其進行處理。 然后將此數據包發送到解析器。
將線程用於manager.py
處理的sniff.py
和parse.py
是否有意義?
manager.py:
import sniff
...
def main():
sniff.main()
sniff.py:
import parse
...
def main():
packets = snifferFunction()
parse.main(packets)
parse.py:
def main(pkts):
parseFunction(pkts)
在某些Python實現(例如CPython)中,線程的缺點是由於全局解釋器鎖(“ GIL”)一次只能有一個線程在執行Python字節碼。
一種選擇是使用多處理。 設置管道或共享內存以使其進行通信后,管理器將啟動嗅探器和解析器。 如果您擁有多核計算機(如今沒有人使用),它將使用兩個核。 由於這是兩個不同的進程,每個進程都運行Python,因此GIL不會打擾您,但是您必須在進程之間共享數據。 這帶來了一些開銷。 但是在這種情況下,您可以在一個嗅探器后面運行多個解析器(假設解析一個數據包比嗅探一個數據包需要更長的時間)。 因此,對於大量流量,這可能會更好地擴展。
另一種選擇是使用事件驅動的編程。 您的程序運行一個循環,檢查網絡數據包的可用性。 如果是這樣,則將其讀入隊列。 如果沒有網絡數據包進來並且隊列中有數據包,則在隊列中的第一個數據包上運行嗅探器。 假設嗅探器可以快速運行。 如果不是,則必須將其划分為較小的子任務。 例如,您可以將Twisted之類的框架用於事件驅動的編程。
問題描述沒有指定您必須並行執行網絡嗅探,是嗎? 如果是這樣,為什么不制作一個程序包並在manager.py
導入相關的類呢?
如果出於性能原因確實需要並行處理,請不要使用線程,而應使用如下所示的線程:
或這個:
https://twistedmatrix.com/trac/
實際上,Twisted可能更適合此類工作,因為它本質上是面向網絡的並發庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.