Poprawna praca z wątkami w Pythonie (włączanie i wyłączanie wątków)

0

Potrzebuję pomocy w związku z małym projektem dotyczącym obsługi wątków w języku Python. Otóż chodzi o mały program, który sczytuje dane do pliku excela i można też w międzyczasie zrobić coś innego (coś włączyć, wyłączyć itd.) Program:
[](https://github.com/MaciejKami[...]ster/measuring_application.py
który napisałem pozwala na uruchomienie wątku, ale po zakończeniu pomiarów, nie można go już uruchomić ponownie. Nie wiem jak to rozwiązać.
Wszelkie rady będą mile widziane, chętnie też przeczytałbym jakieś dobre źródło o wątkach w Pythonie 3, najlepiej takich, które zadziałają na popularnych mikrokomputerach pokroju rasbperry czy beaglebone..

Taki wyjątek mi wyrzuca:
https://drive.google.com/open[...]KrJfKX2zvN9d8i-YSG8LoMAfafBKV

2

W długo-działających (daemon) wielowątkowych aplikacjach stosuje się zazwyczaj model oparty o wątek nadzorcy (często pełniony przez główny wątek aplikacji) i N wątków workerów. Do komunikacji między nadzorcą i workerami stosuje się zazwyczaj kolejkę/kolejki. Prosty przyklad tego modelu: https://docs.python.org/3/library/queue.html#queue.Queue.join

1

Można to zrobić tak:

  • Wystartuj funkcje measure w wątku. Funkcja ta ma w nieskończonej pętli próbować pobrać element z kolejki (input_queue) i go procesować (tak jak w przykładzie w https://docs.python.org/3/library/queue.html#queue.Queue.join)
  • Elementami przekazywanymi kolejką mogą być nazwy plików do przetwarzania
  • Jeżeli measure ma coś zwracać do głównego wątku to użyj osobnej kolejki (output_queue), gdzie komunikacja jest odwrócona (measure wrzuca, main ściąga)
  • main wrzuci nazwę pliku na input_queue, measure go przeprocesuje, wrzuci wynik na output_queue, main ściągnie wynik z output_queue
  • Przy kolejnym pliku wystarczy znowu wrzucić nazwę pliku na kolejkę i poczekać aż measure zwróci wynik na output_queue
  • itp, itd
  • join() użyj jak juz nie będziesz potrzebował procesować kolejnych plików i zechcesz skończyć działanie wątku w którym działa measure
0
CaliforniaDreaming napisał(a):

W długo-działających (daemon) wielowątkowych aplikacjach stosuje się zazwyczaj model oparty o wątek nadzorcy (często pełniony przez główny wątek aplikacji) i N wątków workerów. Do komunikacji między nadzorcą i workerami stosuje się zazwyczaj kolejkę/kolejki. Prosty przyklad tego modelu: https://docs.python.org/3/library/queue.html#queue.Queue.join

Głównie staram się zrozumieć moje zagadnienie odnosząc do tych, które znajduję w internecie.
Przykłady, które znalazłem dotyczą tego co u mnie już działa, czyli, że jest jakaś funkcja w tle i coś robi.
Ale w jaki sposób sprawić, żeby po kliknięciu czegoś ta funkcja już była jakby nieaktywna, a potem po kliknięciu znowu robiła swoje?

1

Przecież komunikat jest całkowicie jasny (threads can only be started once)
Wątek się skończył, a Ty próbujesz go ponownie wystartować - to jest ten fragment kodu:

t = threading.Thread(target=doit_measure, args=("task",))
def buttonStartClicked():
    print("The START button was clicked!")
    if not t.is_alive():
        t.start()

Przed t.start() musisz "zregenerować" obiekt wątku. Być może wystarczy przenieść t=threading... tuż przed wywołanie t.start()

1
t = threading.Thread(target=doit_measure, args=("task",))
def buttonStartClicked():
    global t
    print("The START button was clicked!")
    if not t.is_alive():
        t = threading.Thread(target=doit_measure, args=("task",))
        t.start()

dołożenie global pomogło? Nie żeby to była dobra praktyka, ale zrobienie t= utworzy zmienną lokalną dla funkcji, stąd to nie działa tak jak chcesz.

0

Nie rozumiem wtf. Zrób sobie jakąś tablice która trzyma informacje co jest odpalone a co nie. Srsly, głupia tablica kilku booleanow rozwiązuje ten "problem".

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0