Python socket és while ciklus

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?

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 :)

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!

http://www.redphoto.hu

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.

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.

http://www.redphoto.hu

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