2010-01-21 13 views
15

Uruchomiłem test, ale chcę uruchomić 2 funkcje jednocześnie. Mam aparat i mówię mu, żeby poruszył się przez mydliny, a następnie loguję się do kamery przez SSH, żeby sprawdzić szybkość, na jaką nastawiona jest kamera. Kiedy sprawdzam prędkość, aparat zatrzymał się, więc nie jest dostępna żadna prędkość. Czy istnieje sposób, aby uruchomić te funkcje w tym samym czasie, aby przetestować prędkość kamery. Przykładowy kod znajduje się poniżej:Jak uruchomić dwie funkcje jednocześnie?

class VerifyPan(TestAbsoluteMove): 

    def runTest(self): 

     self.dest.PanTilt._x=350 

     # Runs soap move command 
     threading.Thread(target = SudsMove).start() 

     self.command = './ptzpanposition -c 0 -u degx10' 

     # Logs into camera and checks speed 
     TestAbsoluteMove.Ssh(self) 

     # Position of the camera verified through Ssh (No decimal point added to the Ssh value) 
     self.assertEqual(self.Value, '3500') 

Mam już próbowałem moduł wątków, jak wspomniano poniżej. Wątek nie jest zsynchronizowany z funkcją TestAbsoluteMove.Ssh(). Czy jest jakikolwiek inny kod, którego potrzebuję, aby to działało.

Przyjrzałem się wprowadzeniu argumentów do instrukcji wątku, które wskazują, że wątek działa, gdy funkcja Ssh() działa. Czy ktoś wie, co wpisać w tym oświadczeniu?

Przepraszam, jeśli nie wyjaśniłem poprawnie. Funkcja "SudsMove" przenosi kamerę i logi funkcji "Ssh" do kamery i sprawdza prędkość, z jaką porusza się obecnie kamera. Problem polega na tym, że do czasu zalogowania się funkcji "Ssh" kamera się zatrzymała. Potrzebuję obydwu funkcji, aby działały równolegle, więc mogę sprawdzić prędkość kamery, gdy wciąż się porusza.

Dzięki

+0

Czy możesz zarejestrować prędkość podczas przesuwania aparatu? może do pliku dziennika. Co próbujesz osiągnąć? Nie sądzę, aby powyższy test był i tak użyteczny. – fabrizioM

+0

Edytowałem moją odpowiedź, aby odpowiedzieć na problemy z synchronizacją. – AndiDog

+0

Czy spojrzałeś na moją zredagowaną odpowiedź? Czy jest sens? – AndiDog

Odpowiedz

4

Jeśli chcesz użyć realizację wspólnego Pythona (CPython), z pewnością można użyć modułu multiprocessing, który does wonders (można przekazać bez pickleable argumentów podprocesów, zabić zadania, ...), oferuje interfejs podobny do tego wątków i nie cierpi na Globalną Blokadę Interpretera.

Wadą jest to, że podprocesy są tworzone, co zajmuje więcej czasu niż tworzenie wątków; to powinno być problemem tylko wtedy, gdy masz wiele, wiele krótkich zadań.W sytuacjach, w których każde zadanie trwa "długo", moduł multiprocessing powinien być świetny.

12

importu modułu threading i prowadzone SudsMove() tak:

threading.Thread(target = SudsMove).start() 

To stworzy i rozpocząć wątek tła, które wykonuje ruch.

ODPOWIEDŹ NA edytowane pytanie:

O ile mi zrozumieć to, TestAbsoluteMove.Ssh(self) odpytuje prędkości raz i zapisuje wynik w self.Value? I testujesz oczekiwane pochylenie/obrót/pozycję końca za pomocą self.assertEqual(self.Value, '3500')?!

Jeśli to prawda, należy poczekać, aż kamera rozpocznie ruch. Można prawdopodobnie sondowanie prędkość w określonym przedziale:

prędkość
# Move camera in background thread 
threading.Thread(target = SudsMove).start() 

# What does this do? 
self.command = './ptzpanposition -c 0 -u degx10' 

# Poll the current speed in an interval of 250 ms 
import time 
measuredSpeedsList = [] 

for i in xrange(20): 
    # Assuming that this call will put the result in self.Value 
    TestAbsoluteMove.Ssh(self) 
    measuredSpeedsList.append(self.Value) 
    time.sleep(0.25) 

print "Measured movement speeds: ", measuredSpeedsList 

Ruch będzie największą wartość w measuredSpeedsList (tj max(measuredSpeedsList)). Nadzieja, że ​​ma sens ...

2

Może być tylko jeden wątek uruchomiony w tym samym czasie. Na to odpowiedź szeroko udzielono here. Jednym z rozwiązań będzie użycie dwóch oddzielnych procesów. Powyższa odpowiedź zawiera kilka wskazówek.

1

Jeśli możesz uruchomić swój kod pod Jython lub IronPython, wtedy może uruchomić kilka wątków jednocześnie; nie mają tego głupiego "Global Interpreter Lock" z CPython.

Powiązane problemy