Sziasztok,
Elakadtam és nem találom a választ sehol sem.
Van egy program ami egy socket-ről olvasná a parancsokat és eszerint a parncs szerint végrehajtana dolgokat.
Tehát az egész program egy 'while True' végtelen ciklusban fut. A ciklusban van olyan kód is, aminek folyamatosan (minden ciklusban) le kell futni egyszer
A baj ott kezdődik, hogy a socket olvasás megakasztja ezt a ciklust amíg nem kap valamit a socket-ről:
while True:
msg = usocket.recv(1024)
# ez itt nem fut le addig, míg a socketen nem történik valami.
Oké, utána olvastam, be kell állítani ezt:
socket.setblocking(0)
Ekkor viszont hibaüzenetet dob és elszáll a program.
Mondom nem baj, ha hibát dob, akkor lenyeljük és megyünk tovább, majd jön valami...
És akkor született ez:
while True:
try:
msg = usocket.recv(1024)
except:
pass
# ez itt már lefut, de csak egyszer (pedig while ciklusban van)
És ilyenkor hiba generálódik, belefut a hiba ágba, lefut a while ciklus többi része és utána nem indul őjra a ciklus, hanem kilép.
Miért? Ha egyszer a hibát elnyeltem, akkor miért nem indul újra a ciklus? Ha akkora hiba, akkor miért fut a többi kód tovább?
Lehet, hogy már nagyon késő van, de nem értem.
Tudna valaki segíteni?
- 1291 megtekintés
Hozzászólások
Nem vagyok Python szaki de itt egy példa.
while True:
try:
msg = s.recv(4096)
except socket.error, e:
err = e.args[0]
if err == errno.EAGAIN or err == errno.EWOULDBLOCK:
sleep(1)
print 'No data available'
continue
else:
# a "real" error occurred
print e
sys.exit(1)
else:
# got a message, do something :)
- A hozzászóláshoz be kell jelentkezni
[Feliratkozás]
- A hozzászóláshoz be kell jelentkezni
Ha nem értettem félre a problémát, ezek kellenek neked:
socket.settimeout(timeout)
socket.setdefaulttimeout(timeout)
Továbbá keepalive, hogy ne bomoljon el a valójában élő kapcsolat hosszabb tétlenség esetén se.
http://stackoverflow.com/questions/12248132/how-to-change-tcp-keepalive…
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Illetve érdemes selectet vagy poll-t használnod annak vizsgálatára jött-e adat. Ha igen, akkor olvasol.
De van ilyen is https://docs.python.org/3/library/asyncio.html#module-asyncio
- A hozzászóláshoz be kell jelentkezni
Egy picit máshogy oldottam meg végül, reggel, friss fejjel :)
A blokkolós socket olvasást betettem egy Thread-be, így az nem blokkolja a fő programot. Amikor jön valami a socketen, akkor egy globális változóba beleírja az üzenetet, aztán a fő program while ciklusa ha talál ebben a változóban valamit, akkor végrehajtja.
Megoldva :)
Köszönöm azért a segítséget!
- A hozzászóláshoz be kell jelentkezni
Au.
- A hozzászóláshoz be kell jelentkezni
Mi ezzel a gond? Én mondjuk a parancs feldolgozását is abba a threadbe tettem volna, amelyik a socketről olvas, másikba pedig aminek mindettől függetlenül mennie kell, de miért nem jó a fenti megoldás?
Ave, Saabi.
- A hozzászóláshoz be kell jelentkezni
Mert van erre szebb megoldas is szerintem, bar en is csak beleokoskodok:
Async socket talan jobb lenne.
https://docs.python.org/2/library/asyncore.html
- A hozzászóláshoz be kell jelentkezni
Például. Valamint a Python szálkezelése sem a legtökéletesebb (interpreter lock). Valamint globális változó állítása/használata is ejnye-bejnye. Valamint akkor már aszinkron. Valamint elolvasni a non blocking IO leírását, ami évtizedek óta szinte változatlan, kiforrott.
- A hozzászóláshoz be kell jelentkezni
Mivel a két szál aszinkron fut, ezért simán lehet, hogy két parancs jön be amialatt csak egyet dolgoz fel a másik szál. Így egy változó nem elég. Egy blocking queue a változó helyett már lehet jó, de az általad javasolt egyszerűbbnek tűnik.
- A hozzászóláshoz be kell jelentkezni
Igen, lehetne szebben is, de most próbálgatom a python szárnyaimat. :)
Egyébként a (saját) projekt igényei nem olyan szigorúak, hogy baj lenne abból, ha elveszik egy parancs.
Nem jó, de elfogadható. Az üzenetek nem jönnek olyan gyorsan.
Fogok még finomítani rajta, de egyelőre az volt a cél, hogy a projekt elinduljon, az alapfunkciók működjenek.
- A hozzászóláshoz be kell jelentkezni
Ez nem python szárny, ez bárhol halálfejes. Nyelvfüggetlenül.
- A hozzászóláshoz be kell jelentkezni
Nem szep, ez teny, de ha kontrollaltan kapod az adatokat, eleg sokaig mukodhet a dolog. (uC eseten pl. lehet letjogosultsaga, mert egyszeru, es a kornyezo HW jellegzetessegei miatt tisztaban lehetsz vele, hogy mennyi adatot kapsz es hogyan)
Felteve, hogy megveded a kozosen hasznalt teruleteket. Ha figyelsz a rafutasra (pl. uzeneteknek tombje van, a szamlalot meg noveled 0-1 allitas helyett), akkor meg jo is lehet.
Ebben az esetben persze van jobb, en sem igy csinalnam.
--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames
- A hozzászóláshoz be kell jelentkezni