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

167

    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. Ei sua enään tunnista

      Kun olet vanhentunut ja lihonut.
      Ikävä
      90
      5177
    2. Huomenet naiselle

      Harmittaa ettei ehkä nähdä enää koskaan. Näillä mennään sitten.
      Ikävä
      53
      4066
    3. Mikä kaivatussasi kolahti?

      Mikä oli erityistä?
      Ikävä
      25
      2179
    4. Etsin vastaantulevista sua

      Nyt kun sua ei oo, ikävöin sua niin v*tusti. 😔Jokaisesta etsin samoja piirteitä, samantyyppistä olemusta, samanlaista s
      Ikävä
      27
      1887
    5. Kaikesta muusta

      Mulla on hyvä fiilis. Mä selviän tästä ja sit musta tulee parempi ihminenkin. Ainut, mitä mun pitää nyt välttää on se ko
      Ikävä
      16
      1795
    6. Hyvää yötä.

      Miten äkäpussi kesytetään? 😉 pus
      Ikävä
      15
      1434
    7. Ajatteletko koskaan

      Yhteisiä työvuosia ja millaista silloin oli? Haluaisin palata niihin vuosiin 🥹
      Ikävä
      28
      1250
    8. Tekis mieli lähestyä sua

      Mutta pelkään että peräännyt ja en haluis häiritä sua... En tiedä mitä tekisin olet ihana salaa sua rakastan...💗
      Ikävä
      20
      1036
    9. T, miten mun pitäis toimia

      Olen niin toivottoman ihastunut suhun...ollut jo liian,monta,vuotta. Lähestynkö viestillä? Miten? Sun katse...mä en kest
      Ikävä
      43
      981
    10. Kyllä hävettää!

      Olla taivalkoskelta jos vuoden taivalkoskelainen on tuommoinen tumpelo.
      Taivalkoski
      21
      980
    Aihe