1

Ich mache ein Programm, das 2 Motoren durch einen Raspberry Pi steuert. Ich arbeite mit Python-Code und ich frage mich, wie die folgende erreichen:Warten Sie, bis die Threads fertig sind, bevor Sie sie wieder ausführen.

  • Run motor1
  • Run motor2 gleichzeitig
  • Warten für beide Motoren
  • Run beenden MOTOR1
  • Run motor2 gleichzeitig
  • usw.

    Was ich bisher gemacht habe, ist ein Thread erstellen und eine que verwenden Ue.

    class Stepper(Thread): 
    
        def __init__(self, stepper): 
         Thread.__init__(self) 
         self.stepper = stepper  
         self.q = Queue(maxsize=0) 
    
        def setPosition(self, pos): 
         self.q.put(pos) 
    
        def run(self): 
         while not self.q.empty(): 
          item = self.q.get() 
          // run motor and do some stuff 
    
    thread_1 = Stepper(myStepper1) 
    thread_2 = Stepper(myStepper2) 
    thread_1.start() 
    thread_2.start() 
    
    loop = 10 
    while(loop): 
        thread_1.setPosition(10) 
        thread_2.setPosition(30) 
        # I want to wait here 
        thread_1.setPosition(10) 
        thread_2.setPosition(30) 
        loop = loop - 1 
    
        thread_1.join() 
        thread_2.join() 
    

Sowohl Thread_1 und Thread_2 wird zugleich abhängig von der Anzahl der Stufen der Motor Notwendigkeit zu verarbeiten nicht beenden. Ich habe versucht, die Lock() -Funktion zu verwenden, aber ich bin mir nicht sicher, wie man es richtig umsetzt. Ich dachte auch darüber nach, die Threads neu zu erstellen, bin mir aber nicht sicher, ob dies die richtige Lösung ist.

+0

Bitte korrigieren Sie Ihre Einrückungen, es ist Störung, wenn andere Ihren Code liest. –

+0

Wo entfernst du Items von self.q und wo initialisierst du es wie q = Queue() – rocksteady

+0

Ja, die Warteschlange wird im def __init__ wie folgt initialisiert: self.q = Queue (maxsize = 0) (jeder Thread hat eine eigene Warteschlange); Ich mache auch ein Item = self.q.get() in meiner run() Methode, ich werde meinen Code aktualisieren. – batmat

Antwort

1

können Sie verwenden Semaphore tatsächlich:

from threading import Semaphore 

class Stepper(Thread): 

    def __init__(self, stepper, semaphore): 
     Thread.__init__(self) 
     self.stepper = stepper 
     self.semaphore = semaphore 

    def setPosition(self, pos): 
     self.q.put(pos) 

    def run(self): 
     while not self.q.empty(): 
      try: 
       # run motor and do some stuff 
      finally: 
       self.semaphore.release() # release semaphore when finished one cycle 

semaphore = Semaphore(2) 
thread_1 = Stepper(myStepper1, semaphore) 
thread_2 = Stepper(myStepper2, semaphore) 
thread_1.start() 
thread_2.start() 

loop = 10 
for i in range(loop): 
    semaphore.acquire() 
    semaphore.acquire() 
    thread_1.setPosition(10) 
    thread_2.setPosition(30) 
    semaphore.acquire() 
    semaphore.acquire() # wait until the 2 threads both released the semaphore 
    thread_1.setPosition(10) 
    thread_2.setPosition(30) 
+0

Manche Versuche würden hier endlich perfekt passen, um sicherzugehen, dass das Schloss freigegeben wird. – rocksteady

+0

@rocksteady wahr. –

+0

Danke, ich versuche mit Semaphor, aber ich laufe auf Probleme: - Es scheint, dass, wenn ich() den Thread, weil die Warteschlange leer ist, der Thread stoppt, und nie wieder ausgeführt werden. (Wenn ich zum Beispiel self.run() in setPosition() aufrufen, werden die Threads nicht mehr gleichzeitig ausgeführt) - Ich kann eine while (True) in der run-Methode hinzufügen, aber dann wird der Thread niemals stoppen und programmieren wird nie enden. – batmat

0

Sie können die join Methode des Threads verwenden wie so:

thread_1.join() # Wait for thread_1 to finish 
thread_2.join() # Same for thread_2 

Gemäß der Dokumentation bei https://docs.python.org/3/library/threading.html#threading.Thread.join:

Ein Thread kann sei join() ed viele Male.

Um Threads wiederholt auszuführen, müssen Sie das Objekt Thread nach jedem Lauf erneut initialisieren.

+0

Er benutzt Join, aber er erstellt Threads nicht neu. – rocksteady

+0

Ich bin mir nicht sicher, wie man das Thread-Objekt nach jedem Lauf "reinitialisiert". Ist das nur ein Thread_1 = Stepper (myStepper1) in meiner while (Schleife)? Ich bin mir nicht sicher, ob dies die beste Lösung ist, aber ich bin wieder neu im Python-Code. – batmat

Verwandte Themen