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).
Python 2 - threadin käynnistäminen + callback parametrina
4
233
Vastaukset 4
- Anonyymi
Säikeistämisestä esimerkkejä: https://pymotw.com/2/threading/
- 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
Ampuminen kylpylässä
Onko vornasen timbe käynyt hiukan kylpemässä vai mikä tämä ampumatapaus on kylpylässä? Tuntuu aika villi meno olevan naa751679- 231182
Kemijärvellä vesionnettomuus
Pitkänsillan ja taiteilijanniemen välillä nähty henkilön painuvan veden alle. Mitä on tapahtunut? Onko vesihiisi taas as321073Hei, voitko kuunnella
Voisitko auttaa minua selvittämään asioita? En halua ajaa sinua hulluuteen kanssani, en sitoa sinua, en esittää vaatimu134906Joku porukka lähtenyt täältä
Ihmeen hiljainen on palsta nyt. Yleensä tänne tulvii aloituksia yms, mutta nyt on kyllä erikoisen hiljaista.189826- 64694
Olipa yllätys
Kuten hyvin moni tiesi/arvasi että valetta alusta loppuun toi *olemme ystäviä* satu. Instassaan käsi kädessä kuva kertoo192619On todella ikävää
Todella ikävää, että asiat ovat menneet tällaisiksi. Tämä ei ollut missään vaiheessa tarkoitukseni. Olen tehnyt virheit79598- 49561
- 71557
Se kun olit pitkästä aikaa silmieni edessä
Oli kyllä sykähdyttävää. Tiedätkö, mikä laittaa minut ikävöimään sinua? Kun palautan mieleeni valtavan ihanan olemuksen,32518- 55517
- 57485
Oletteko koskaan torjuneet kaivattuanne?
Minä olen, kun en silloin tajunnut vielä ihastuneeni. Yritin paikata tapahtunutta, mutta ei onnistunut enää.25457Kai sä mies ymmärrät..
..ettet jättänyt vaihtoahtoa. Tottakai toivon vielä, että pystyisit toimimaan niin että asiat korjaantuisivat. Vahvast28432- 34424
- 33423
- 40417
- 16409
- 82398