何时使用线程是有意义的

时间:2014-05-14 21:21:53

标签: python multithreading

我在弄清楚是否有必要使用线程来构建我正在构建的解决方案,或者我是否应该保持原样。我有一个脚本(manager.py)调用另一个脚本(sniff.py)来嗅探网络数据包,另一个脚本(parse.py)来解析被嗅探的数据包。

manager.py脚本仅用于触发应用程序。对于收到的每个数据包,嗅探器都会处理它。然后将此数据包发送到解析器。

sniff.py中处理的parse.pymanager.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)

2 个答案:

答案 0 :(得分:0)

某些Python实现(如CPython)中线程的缺点是由于全局解释器锁定(" GIL"),一次只有一个线程可以执行Python字节码。

选项可以是使用多处理。管理员在设置管道或共享内存后与其进行通信,然后启动sniff和parser。如果你有一台多核机器(现在还没有,那么这将使用两个核心)。由于这些是两个不同的进程,每个进程运行Python,你不会被GIL困扰,但你必须在进程之间共享数据。这引入了一些开销。但是在这种情况下,您可以在一个嗅探器后面运行几个解析器(假设解析数据包需要的时间比嗅探数据包更长)。因此,对于大量流量来说,这可能会更好地扩展。

另一种选择是使用事件驱动编程。您的程序运行一个循环,检查网络数据包的可用性。如果是这样,则将其读入队列中。如果没有网络数据包进入并且队列中有数据包,则嗅探器在队列中的第一个数据包上运行。这假设嗅探器可以很快运行。如果不是,则必须将其划分为较小的子任务。你可以,例如使用像Twisted这样的框架来进行事件驱动编程。

答案 1 :(得分:0)

问题描述并未指定您必须并行执行net sniff,是吗?如果是这样,为什么不只是制作一个包并导入manager.py中的相关类?

如果出于性能原因需要并行性,请不要使用线程,但请像这样:

http://www.gevent.org/

或者这个:

https://twistedmatrix.com/trac/

Twisted实际上可能更适合这种工作,因为它本质上是面向网络的并发库。