线程 Python 脚本似乎仅在发出键盘中断信号后才按预期工作?

Threaded Python script only seems to work as expected after signaling keyboard interrupt?

基本上,我有一个脚本可以在一个线程中嗅探数据包,并将它们附加到列表中。第二个线程也运行,如果列表不为空,它将对数据进行计算。然而,嗅探线程似乎只有在按下 Ctrl + C 后才能正常工作。在发送键盘中断之前,我为调试生成的控制台输出非常慢,而且似乎丢失了数据包。之后按 Ctrl + C 它运行得更快并且按预期工作。任何想法为什么会发生这种情况?我的代码看起来类似于下面的内容。

数据包嗅探器:

import socket, sys
from struct import *

def eth_addr(a): 
    #create a AF_PACKET type raw socket (thats basically packet level)
    #define ETH_P_ALL    0x0003          /* Every packet (be careful!!!) */
    try:
        s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
    except socket.error , msg:
        print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
        sys.exit()

def packet_sniff():     
    # receive a packet
    while True:
        packet = s.recvfrom(65565)

        #packet string from tuple
        packet = packet[0]

        #parse ethernet header
        eth_length = 14

        eth_header = packet[:eth_length]
        eth = unpack('!6s6sH' , eth_header)
        eth_protocol = socket.ntohs(eth[2])
        print 'Destination MAC : ' + eth_addr(packet[0:6]) + ' Source MAC : ' + eth_addr(packet[6:12]) + ' Protocol : ' + str(eth_protocol)

        #TCP protocol
        if protocol == 6 :
            t = iph_length + eth_length
            tcp_header = packet[t:t+20]

            #now unpack them
            tcph = unpack('!HHLLBBHHH' , tcp_header)

            source_port = tcph[0]
            dest_port = tcph[1]
            sequence = tcph[2]
            acknowledgement = tcph[3]
            doff_reserved = tcph[4]
            tcph_length = doff_reserved >> 4

            print 'Source Port : ' + str(source_port) + ' Dest Port : ' + str(dest_port) + ' Sequence Number : ' + str(sequence) + ' Acknowledgement : ' + str(acknowledgement) + ' TCP header length : ' + str(tcph_length)

            h_size = eth_length + iph_length + tcph_length * 4
            data_size = len(packet) - h_size

            #get data from the packet
            data = packet[h_size:]

            return data

主要内容大致如下所示:

def run_program():
    processThread1 = threading.Thread(target = self.sniff_data, args = [])   
    processThread2 = threading.Thread(target = self.process_data, args = [])
    processThread1.start()
    processThread2.start()

def sniff_data():
    global my_list
    while True:
        data = packet_sniff()
        my_list.append(data)

def process_data():
    global my_list
    while True:
        if len(my_list) != 0:
            # Do computation

my_list = []
run_program()

if len(my_list) != 0: 没有睡眠 运行 可以无限地锁定解释器,防止其他线程更改 my_list。那需要去。