我在弄清楚是否有必要使用线程来构建我正在构建的解决方案,或者我是否应该保持原样。我有一个脚本(manager.py
)调用另一个脚本(sniff.py
)来嗅探网络数据包,另一个脚本(parse.py
)来解析被嗅探的数据包。
manager.py脚本仅用于触发应用程序。对于收到的每个数据包,嗅探器都会处理它。然后将此数据包发送到解析器。
对sniff.py
中处理的parse.py
和manager.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)
答案 0 :(得分:0)
某些Python实现(如CPython)中线程的缺点是由于全局解释器锁定(" GIL"),一次只有一个线程可以执行Python字节码。
选项可以是使用多处理。管理员在设置管道或共享内存后与其进行通信,然后启动sniff和parser。如果你有一台多核机器(现在还没有,那么这将使用两个核心)。由于这些是两个不同的进程,每个进程运行Python,你不会被GIL困扰,但你必须在进程之间共享数据。这引入了一些开销。但是在这种情况下,您可以在一个嗅探器后面运行几个解析器(假设解析数据包需要的时间比嗅探数据包更长)。因此,对于大量流量来说,这可能会更好地扩展。
另一种选择是使用事件驱动编程。您的程序运行一个循环,检查网络数据包的可用性。如果是这样,则将其读入队列中。如果没有网络数据包进入并且队列中有数据包,则嗅探器在队列中的第一个数据包上运行。这假设嗅探器可以很快运行。如果不是,则必须将其划分为较小的子任务。你可以,例如使用像Twisted这样的框架来进行事件驱动编程。
答案 1 :(得分:0)
问题描述并未指定您必须并行执行net sniff,是吗?如果是这样,为什么不只是制作一个包并导入manager.py
中的相关类?
如果出于性能原因需要并行性,请不要使用线程,但请像这样:
或者这个:
https://twistedmatrix.com/trac/
Twisted实际上可能更适合这种工作,因为它本质上是面向网络的并发库。