2016-10-30 3 views
0

Pythonsスレッディングモジュールをクラス内の1つの関数に使用して成功しましたが、クラス内の複数の関数に拡張したいと考えています。たとえば、私はいくつかのデータを解析するプログラムを持っています。私はメインクラスを持っており、メインクラスには処理されるデータとは異なることを行う複数の関数があります。各関数は、特定の条件が満たされたときに呼び出されます。ここで私のプログラムに似た作られた機能を備えたいくつかの構成されたプログラムがあります。Pythonのスレッディングモジュールでクラス内で複数の関数をマルチスレッドする

class MainClass(): 
    def __init__(self): 

     while True: 
      rawData=self.receiveData(file) #a made up function to receive data 
      stuffOne, stuffTwo, stuffThree, stuffFour, data=self.MainParseFunction(rawData) #returns four things and some data 

      if stuffOne=="a": 
       self.functionOne(data) 
       print("Output of Function One") 
      elif stuffTwo=="b": 
       self.functionTwo(data) 
       print("Output of Function Two") 
      elif stuffThree=="c": 
       self.functionThree(data) 
        print("Output of Function Three") 
      elif stuffFour=="d": 
       self.functionFour(data) 
        print("Output of Function Four") 

    def MainParseFunction(self, data): 
     '''Do some stuff to the data being passed to my function and return a bunch of variables to be use in the other functions '''   
    def functionOne(self, data): 
     '''Do some stuff to the data being passed to my function and return a bunch of variables to be printed ''' 
    def functionTwo(self, data): 
     '''Do some stuff to the data being passed to my function and return a bunch of variables to be printed ''' 
    def functionThree(self, data): 
     '''Do some stuff to the data being passed to my function and return a bunch of variables to be printed ''' 
    def functionFour(self, data): 
     '''Do some stuff to the data being passed to my function and return a bunch of variables to be printed ''' 

if __name__ == ('__main__'): 
    MainClass() 

私の実際のプログラムはより複雑で実際に処理をスピードアップするためにスレッドを使用したい多くのデータを処理しますが、私はそれが呼び出されるときに1つの関数を呼び出すときにスレッドをしたいと思います。私が見たほとんどの例は、複数の関数ではない単一の関数を対象にしています。私はこれが可能であると仮定します。私はこれについてどうやって行くのか分かりません。

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() 
+0

それぞれがターゲットとして機能するスレッドを1つ起動するだけでは不十分ですか?つまり、... t1 = threading.Thread(target = self.functionOne)のようなものです。 t2 = threading.Thread(target = self.functionTwo); t3 = threading.Thread(target = self.functionThree)...などのように? – BorrajaX

答えて

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()関数を使用していますためのでやめない限り、私はまだ私のスレッドが無限に実行した上で働いています

関連する問題