多进程socket共用

最近遇到一个需求:我的程序需要接收某个节点传来的UDP报文(来自sFlow),然后对报文进行纯CPU密集型的分析。在某些时候UDP报文的数量可能会很大,另外为了分析结果的准确我不希望太多的丢包。本来是想用threading直接通过Queue来个生产者消费者模式的,但由于是CPU密集型的分析工作所以对于Python来说这样效率不会有多少提高。因此考虑多进程。

原理很简单:建立了socket,然后多个进程复用这个socket,内核会保证数据包只被一个进程消化(如果想深入学习这类IO处理方法的同学建议看下tornado的代码):

例子:

import sys
import socket
import select
import os

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(("127.0.0.1", 6343),)

    for _ in range(0, 10):
        pid = os.fork()
        if pid < 0:
            print("fork error")
        elif pid > 0:
            print("fork successful, pid is %d" % pid)
            break

    while True:
        data, addr = s.recvfrom(65535)
        print "Get Data in pid: {0}".format(os.getpid())

if __name__ == "__main__":
    main()

可以使用如下命令进行压测:

nping --udp --dest-port 6343 --data-length 1400 --rate 2000 --count 10000 --no-capture --quiet 127.0.0.1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*