使用Python的线程模块在类中多线程多个函数

时间:2016-10-30 04:32:26

标签: python multithreading python-3.x python-multithreading

我已经成功地将Pythons Threading模块用于类中的单个函数,但是我想将它扩展为类中的多个函数。例如,我有一个解析一些数据的程序。我有我的主类,在我的主类中,我有多个函数,它们对处理的数据做了不同的事情。在满足某些条件时调用每个函数。这是一些编程程序,其中包含类似于我的程序的组合函数。

def threader(): 
        while True:
            job=self.q.get() 
            self.MainParseFunction(job) 
            self.q.task_done()

for _ in range(10): 
    t=threading.Thread(target=self.functionOne) 
    t.daemon=True
    t.start()

for job in range(1,500): 
    self.q.put(job) 

self.q.join()

虽然我的实际程序更复杂,但实际上处理了大量数据,我想使用线程来加速这个过程。我想在调用时调用一个函数,然后调用另一个函数等。我看到的大多数示例只针对单个函数而不是多个函数。我认为这是可能的,我只是不知道该怎么做。

print qq{<td>$variable</td>};

1 个答案:

答案 0 :(得分:0)

我能够弄清楚如何实现这一目标。在阅读了有关线程模块的更多信息后,我能够编写一个可以正常工作的线程,而无需对每个函数进行线程处理。这是我实际程序中的代码而不是上面的代码;

class PacketSniffer(threading.Thread):
def __init__(self, rawData, currentTime):
    super(PacketSniffer,self).__init__()
    self.rawData=rawData
    self.currentTime=currentTime

    destinationMAC, sourceMAC, etherType, data = self.Ethernet_Frame(self.rawData)
    print("\t Ethernet Frame - {} - Destination: {}, Source: {}  Protocol: {}".format(self.currentTime, destinationMAC, sourceMAC, etherType))

    if etherType.__eq__(8):
        version, headerLength, TTL, protocol, source, destination, packetData=self.IPv4_Packet(data)
        print("\t IPv4 Packet - {} - Version: {}, Header Length: {}, TTL: {}, Protocol: {}, Source: {} Destination: {}".format(self.currentTime, version, headerLength, TTL, protocol, source, destination))

        if  protocol.__eq__(1):
            ICMP_type, code , checksum, packetData=self.ICMP_Packet(data)
            print("\t ICMP Packet - {} - ICMP Type: {}, Code: {}, TTL: {}, Checksum: {}".format(self.currentTime, ICMP_type, code, checksum))

        elif protocol.__eq__(6):
            sourcePort, destinationPort, seqNumber, destNumber, urgFlag, ackFlag, pshFlag, rstFlag, synFlag, finFlag, tcpData=self.TCP_Packet(data)
            print("\t TCP Packet - {} - Source Port: {}, Destination Port: {}, Sequence Number: {}, Acknowledgment: {}, URG Flag: {}, ACK Flag: {}, PSH Flag: {}, RST Flag: {}, SYN Flag: {}, FIN Flag: {}".format(self.currentTime, sourcePort,destinationPort, seqNumber, destNumber, urgFlag, ackFlag, pshFlag, rstFlag, synFlag, finFlag))

        elif protocol.__eq__(17):
            sourcePort, destinationPort, datagramLength, udpData=self.UDP_Packet(data)
            print("\t UDP Packet - {} - Source Port: {}, Destination Port: {}, Datagram Length: {}".format(currentTime,sourcePort, destinationPort, datagramLength))
        else:
            pass    

这是我创建和执行我的线程的地方。

if __name__.__eq__('__main__'):
try:
    connection=socket(AF_PACKET, SOCK_RAW, ntohs(0x0003))
except error:
    print('Connection could not be established. Program exiting!')
    sys.exit()
rawData, address = connection.recvfrom(65535)
currentTime = time.asctime( time.localtime(time.time()))
while True:
    thread=threading.Thread(target=PacketSniffer, args=(rawData, currentTime))
    thread.daemon=True
    time.sleep(1)
    thread.start() 
thread.join()

我仍在努力让我的线程无限运行,除非我现在退出所以我使用while循环和time.sleep()函数来运行我的脚本并仍然能够处理输出