Sockety, multithreading - jak czekać na dane ?

0

Witam,

w ramach 'zabawy' robię sobie serwerek, który ma obsługiwać na bieżąco wiele klientów. Na razie nic specjalnego to nie robi. Chcę dobrze zrobić 'podstawę', aby potem móc coś z tego bardziej pożytecznego..

Zastanawia mnie aktualnie następująca rzecz - serwer przy nawiązywaniu nowego połączenia tworzy sobie nowy wątek (pewnie przy dużej liczbie klientów, lepiej wykorzystać podejście 'współbieżne' i eventloop, ale nie w tym rzecz..), dodaje sobie do na listę wątków i sobie te wątki obsługuje. Rzecz w tym, że owy wątek ma mniej więcej taką budowę:

class ClientSocket(threading.Thread):
  ..
  def run(self):
    ..
    while True: #istota tego wpisu/postu
       ..
       data = self.client.recv(BUFFOR_SIZE)
       ..
       sleep(0.5)

Czy w taki sposób załatwia się oczekiwanie na dane /(uśpienie wątku) ? Bo jakby nie patrzeć jest to ciągłe usypianie/wybudzanie wątku.. Nie ma czegoś takiego (eventu) jak wybudzanie wątku w momencie pojawienia się danych ? Jeśli tak, to jak to wygląda ? (jak poszukać informacji na ten temat)

pzdr,
Al

0

recv jest blokujace o ile nie ustawiles wczesniej timeoutu. A jak ustawiles timeout to recv rzuci wyjatek jezeli dane nie nadejda w ustalonym czasie, ktorego nie obslugujesz (przynajmniej w tym kodzie, ktory podales). Tak wiec sleep jest zbedny.

0

@0x200x20 - bingo!, tzn. chyba o to chodziło ;)

Poszperałem jeszcze w sieci jakieś przykłady i wszystko, co znajdywałem, opierało się na pętli nieskończonej (więc coraz bardziej 'myląca' zdawała mi się odpowiedź @spartanPAGE). Przykłady: (http://www.techbeamers.com/python-tutorial-write-multithreaded-python-server/ ; http://ilab.cs.byu.edu/python/threadingmodule.html ; https://www.tutorialspoint.com/python/python_multithreading.htm).

Sprawdziłem doświadczalnie, jak to wygląda z tym recv i rzeczywiście jest tam blok (dokumentacja też o tym wspomina w jednym miejscu: If the connection has not been broken, you may wait on a recv forever, because the socket will not tell you that there’s nothing more to read (for now).

Podsumowując - przykłady, które przytoczyłem są jak najbardziej poprawne i normalnie stosowane ?

ps. @spartanPAGE - link do paczki socketserver pewnie byłby dobrym krokiem, jednak chciałem coś 'prostszego' (bliżej socketów).

0

Nieco po czasie: poll, select, asyncore. One akurat działają w jednym wątku, ale robią to co chcesz, tj. operują na eventach.

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