Python 2 - threadin käynnistäminen + callback parametrina

Anonyymi

Minun pitäisi tehdä Pythonilla softa, joka käynnistää erillisessä threadissa UDP listenerin (eri nuuskitaan tietystä IP-osoitteesta ja portista tulevaa UDP-liikennettä. Säikeelle pitäisi pystyä myös välittämään callback-funktio, koska listenerin pitäisi pystyä tarpeen mukaan lähettämään tietoa kutsujalle. Olen kokeillut määritellä python-luokan, jossa on yhtenä osana thread-funktio muodossa

def listener(self, callback=None):
...

Ja käynnistysfunktiossa joko muodossa

lt = Threading.thread(target=listener, args=(callback));

tai

lt = Threading.thread(target=listener, args=[callback]);

callback annetaan parametrina kutsuvalle funktiolle, jota kutsutaan tyyliin

startlistener(data_handler)

ja itse käsittelyfunktio on määritelty

def data_handler(data):
...

Ensimmäinen tapaus antaa virheen, jonka mukaan parametrin pitäisi olla iterable, toinen tapaus valittaa, että bind tarvitsee vain yhden parametrin, mutta oli annettu 2. Python ei ole vahvuuksiani, mutta sattuneesta syystä homma käytännössä täytyy tehdä sillä (ja nimen omaan kakkosversiolla).

4

206

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi
    • Anonyymi

      Ensimmäisessä tapauksessa python ei todennäköisesti ymmärrä argumenttiasi tuple-tyyppisenä, jos se kerran valittaa ettei se ole iteroituva.

      Toisessa tapauksessa olet todennäköisesti mokannut "self" -määreen kanssa, mikä on aika tyypillinen moka python-tyylisessä olio-ohjelmoinnissa. Luokan sisällä olevien funktioiden ensimmäinen argumentti on aina "self', joka viittaa isäntäolioon.

    • Anonyymi

      Tarkistin kyseisen luokkamäärittelyn. Luokassa kaikissa funktioissa on alussa self, kuten pitääkin. Kokeilin myös muuttaa listenerin alustuksessa parametrimäärittelyn muodosta "args=(callback)" muotoon "args=(callback,)" kuten olen nähnyt esimerkkikoodeissa, jolloin tuli taas tuo bind-virhe.

      Mistä tuli mieleen. Koodissa bind-funktiota käytetään tuon soketin bindaukseen (kirjoitin sen esimerkkikoodien mukaisesti). Nykyisellään soketin luonti ja bindaus tehdään seuraavasti:

      listen_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      listen_socket.bind(self.ip_address, self.port)

      tuossa siis jäsenet ip_address ja port on asetettu etukäteen. Voisiko olla, että katsomani esimerkki viittasi Python 3:een, jossa on eri muotoinen bindaus ja tuo kakkosen versio ei hyväksy portin numeroa parametrina vaan ottaa vastaan mistä tahansa portista tulevan datan ? Voidaanko portti siinä tapauksessa määritellä jotenkin muuten vai pitääkö portti tarkistaa kullekin vastaanotetulle paketille erikseen ? Nykyisellään paketin vastaanottaminen tehdään seuraavasti:

      data, addr = listen_socket.recvfrom(2048)

      (edelleen kopioitu esimerkeistä). Onko tuossa tapauksessa addr portin numero ?

    • Anonyymi

      vähän vanha ketju, mutta tuossa :
      lt = Threading.thread(target=listener, args=(callback));
      on virhe.
      argumentit kuuluu antaa näin:
      lt = Threading.thread(target=listener, args=(callback,));

      eli toi pilkku on äärimmäisen oleellinen siinä ja se ei voi toimia ilman,

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Rakas

      Eihän se tietysti minulle kuulu, mutta missä sinä olet? 😠
      Ikävä
      69
      4387
    2. Pidit itseäsi liian

      Vanhana minulle? Niinkö?
      Ikävä
      66
      4042
    3. Kiva kun SDP alkaa hallitsemaan Suomea

      Vanhat hyvät ajat taas palaavat ja kansa vaurastuu. Muistatteko vielä Sorsan aikakauden? Silloin Suomessa tehtiin jopa
      Maailman menoa
      117
      3872
    4. SDP:n lyhyt selviytymisopas

      1. Komitea on vastaus, oli kysymys mikä tahansa Jos maailma on muuttumassa tai jossain palaa, demari ei hätiköi. Ensin p
      Maailman menoa
      76
      3215
    5. Joko olet luovuttanut

      Mun suhteen?
      Ikävä
      86
      3152
    6. Haluaisitko oikeasti

      Vakavampaa välillemme vai tämäkö riittää
      Ikävä
      63
      2397
    7. Keskisen kyläkaupassa Temun vaatteita myynnissä?

      Siis mitä? Miksi siis ei itse tilaisi Temusta samoja.
      Maailman menoa
      62
      1796
    8. SÄHKÖLASKU 1600 EUROA Ei tässä ole mitään järkeä

      https://www.is.fi/taloussanomat/art-2000011804443.html Kyllä täysin huijausta nämä sähkömarkkinat. Varsinkin pörssisähk
      Maailman menoa
      217
      1272
    9. Nanna Karalahti :Paljastus bisneksistä Jere Karalahden kanssa!

      Ottanut yhteyttä seiskalehden toimittajaan ja kertonut totuuden yhteisestä Herotreeni-nimisestä verkkovalmenuksesta.
      Kotimaiset julkkisjuorut
      128
      1253
    10. Mitä se olisi

      Jos sinä mies saisit sanoa kaivatullesi mitä vain juuri nyt. Ilman mitään seuraamuksia yms. Niin mitä sanoisit?
      Ikävä
      41
      1235
    Aihe