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

146

    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. Huomenta ihana

      Kauniskasvoinen ihanuus 😘 saan sut vielä
      Ikävä
      45
      7372
    2. Hei rakas...

      Miten on työpäivä sujunut? Rakastan sinua 💗
      Ikävä
      32
      4068
    3. Ei tämä etene ikinä

      Kun kumpikaan ei enää ota yhteyttä. Mä en ainakaan uskalla.
      Ikävä
      57
      3605
    4. Edelleen sitä on vaikea uskoa

      Että olisit oikeasti rakastunut muhun
      Ikävä
      50
      3130
    5. Vitsi mihin menit. Heti takasin.

      Mä näin sut tuu takasin! Oli kiire, niin en ehtiny sin perään!
      Ikävä
      17
      2806
    6. Voi ei! Jari Sillanpää heitti keikan Helsingissä - Hämmästyttävä hetki lavalla...

      Ex-tangokuningas on parhaillaan konserttikiertueella. Hän esiintyi Savoy teatterissa äitienpäivänä. Sillanpää jakoi kons
      Suomalaiset julkkikset
      51
      2314
    7. Miksi et irrota otettasi

      Suhteeni?
      Ikävä
      53
      2307
    8. Toiveikas vai toivoton

      torstai? Ajatuksia?
      Ikävä
      37
      2258
    9. Koko ajan olet

      Senkin suhteen kiusannut. Halut on ihan mielettömät olleet jo pitkään
      Ikävä
      43
      2258
    10. Mukavaa päivää

      Mun rakkauden kohteelle ❤️ toivottavasti olet onnellinen
      Ikävä
      16
      2236
    Aihe