2016-10-21 2 views
0

Ich versuche, meinen Worker-Threads sowohl ein Ereignis als auch eine Warteschlange zu geben. Die Warteschlange ist für sie, um miteinander zu sprechen. Das Ereignis soll ihnen signalisieren, dass sie bei Bedarf aufhören zu arbeiten. Ich halte diesen Fehler und ich kann nicht ganz herausfinden, was mit meiner Definition Konstrukteurs falsch istProblem beim Starten von Multiprozess-Threads und bei Verwendung von Ereignissen

ist hier der Fehler:

Traceback (most recent call last): 
    File "dualThreaded.py", line 52, in <module> 
    c = get_Count(q, e) 
TypeError: __init__() takes exactly 2 arguments (3 given) 

Hier ist mein Code:

from Queue import Empty 
from multiprocessing import Process, Queue, Event 
import time 

class get_Count(object): 
    def __init__(self, q): 
     self.q = q 

    def run(self, e): 
     i = 0 
    run = True 
     while run == True: 
      print 'putting' 
      self.q.put('foo %d' % i) 
      time.sleep(.5) 
      if e.is_set(): 
      run = False 

class read_Count(object): 
    def __init__(self, q): 
     self.q = q 

    def run(self, e): 
     while True: 
      try: 
       value = self.q.get(False) 
       print value 

      except Empty: 
       print 'Nothing to process atm' 
       e.set() 
      time.sleep(.2) 



if __name__ == '__main__': 

    e = Event() 
    q = Queue() 
    c = get_Count(q, e) 
    l = read_Count(q, e) 

    p1 = Process(target=c.run) 
    p1.start() 

    p2 = Process(target=l.run) 
    p2.start() 

    p1.join() 
    p2.join() 

bearbeiten feste Tippfehler:

+0

Ihr Codebeispiel stimmt nicht mit der Fehlermeldung überein. Es gibt keine Zeile 52, und es gibt keine Klasse "get_Proc_Count". Auch das Einrücken ist durcheinander. Bitte lesen Sie die Anleitung zur Herstellung eines [MCVE]. – ekhumoro

Antwort

0

Ignorieren Sie Ihren ungenauen Stapelrahmen für einen Moment, denken Sie an c = get_Count(q, e). get_Count Initialisierer def __init__(self, q): nimmt nur einen Parameter nach dem obligatorischen self, aber Sie rufen es mit zwei. Ich habe Ihren Code aktualisiert, um e in Ihrem Initialisierer zu enthalten und einige kleinere Bereinigungen durchzuführen. Es läuft irgendwie, aber Sie werden wahrscheinlich die nächste Ausgabe ausarbeiten müssen.

from Queue import Empty 
from multiprocessing import Process, Queue, Event 
import time 

class get_Count(object): 
    def __init__(self, q, e): 
     self.q = q 
     self.e = e 

    def run(self): 
     i = 0 
     run = True 
     while run == True: 
      print 'putting' 
      self.q.put('foo %d' % i) 
      time.sleep(.5) 
      if self.e.is_set(): 
       run = False 

class read_Count(object): 
    def __init__(self, q, e): 
     self.q = q 
     self.e = e 

    def run(self): 
     while True: 
      try: 
       value = self.q.get(False) 
       print value 

      except Empty: 
       print 'Nothing to process atm' 
       self.e.set() 
      time.sleep(.2) 


if __name__ == '__main__': 

    e = Event() 
    q = Queue() 
    c = get_Count(q, e) 
    l = read_Count(q, e) 

    p1 = Process(target=c.run) 
    p1.start() 

    p2 = Process(target=l.run) 
    p2.start() 
Verwandte Themen