Reactor.run blochează buclele

Am un socket Twisted pe care încerc să îl rulez pe mai multe porturi. Codul următor a lucrat pentru mine înainte, dar asta a fost în jur de o lună în urmă, deoarece nu am atins codul deoarece, dacă îmi amintesc bine. Acum, după ce am reintrodus codul în programul meu Twisted, nu mai funcționează.

class Socket(Protocol):
    table = Table()

    def connectionMade(self):
        #self.transport.write("""connected""")
        self.factory.clients.append(self)
        print "Clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

    def dataReceived(self, data):
        #print "data is ", data
        a = data.split(':')
        if len(a) > 1:
            command = a[0]
            content = a[1]

            if command == "Number_of_Players":
                msg = table.numberOfPlayers


        print msg

        for c in self.factory.clients:
                c.message(msg)

    def message(self, message):
        self.transport.write(message)

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)
    #print "Blackjack server started"
    reactor.run()

De obicei, serverul Blackjack ar fi început să pornească de multe ori în intervalul pe care l-am setat, dar acum nu. Pentru a testa dacă a fost înfășurată sau nu, am pornit să tipăresc i, dar a tipărit doar 0. Din anumite motive, buclă for looped only 1 time.

Orice sugestii? Mulțumiri!

0
@Levon A fost tipărită 9 pentru tot, după ce reactor.run() a fost necomentată, a fost tipărită doar 0.
adăugat autor Alec, sursa
Chestia e că acest cod a funcționat înainte. De ce nu acum?
adăugat autor Alec, sursa
@ PsychicOak Ce vrei sa spui daca alerga are o bucla in ea?
adăugat autor Alec, sursa
Ceea ce vreau sa spun este ca poate functioneaza o buclă în interiorul reactor.run() și, prin urmare, bucla pentru nu continuă deoarece așteaptă ca reactor.run() să termine.
adăugat autor IT Ninja, sursa
nu reactor.run() au o buclă în ea? S-ar părea că așa este, deoarece nu permite să treacă acolo.
adăugat autor IT Ninja, sursa

3 răspunsuri

Ai un fel de mesaj de eroare? Nu este nimic în neregulă cu bucla de bază. Aș sugera să comentez toate liniile de mai jos print i și apoi să le adăugați selectiv înapoi până când se oprește buclă - ceea ce vă va spune ce cauzează problema (evident că a doua imprimare nu este o problemă)

Poate că listenTCP() este în așteptare pentru o conexiune?

Sau, eventual, aveți o buclă infinită într-una din funcțiile pe care le apelați. Singura modalitate de a fi sigur că nu vedeți celălalt cod este eliminarea posibilelor probleme prin comentarea codului suspect și adăugarea lui înapoi.

Update: Based on your new information, the problem obviously is with reactor.run(). If the code is self-contained enough you could post it for examination.

Două probleme potențiale în reactor.code() , o buclă infinită sau în așteptare pentru un eveniment/.

Buclele pot fi infinite, adică codate incorect, astfel încât să pornească, dar nu se termină niciodată. Acest lucru ar părea că programul se întrerupe/oprește (chiar dacă procesorul pornește ca un nebun). Alternativ, programul ar putea întrerupe dacă aștepta o intrare/eveniment.

0
adăugat
Am făcut o conexiune după ce a apărut 0, dar nu sa mai întâmplat nimic altceva decât a spus că am fost conectat.
adăugat autor Alec, sursa
Ok, mulțumesc lui Levon.
adăugat autor Alec, sursa
Voi posta chiar acum.
adăugat autor Alec, sursa
Am comentat totul, apoi necomentat. Este tipărită de la 0 la 9 până când nu am reacționa reactor.run (), care a imprimat doar 0.
adăugat autor Alec, sursa
@AlecK. Cât de mare este codul pentru reactor.run .. poți să-l postezi? Are o buclă (eventual infinită accidental) sau așteaptă ceva?
adăugat autor Levon, sursa
+1; Mă gândeam la același lucru, deși e greu de spus fără să vezi mai mult cod.
adăugat autor senderle, sursa
@Levon: Ai avut dreptate în estimarea ta, Twisted este un asychrovous (eveniment-condus) cadru. Deci, "inima" este în realitate o buclă infinită, care este în așteptare pentru evenimente/intrări tp să apară. Se execută pentru totdeauna sau până când se oprește prin executarea unei metode interne ( reactor.stop() ).
adăugat autor ypercubeᵀᴹ, sursa

O excepție a fost aruncată înainte de a ajunge la imprimarea de depanare.

Prindeți-l prin împachetarea blocului afișat cu try: ... cu excepția .

try:
       reactor.listenTCP(1025+i, factory)
except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except:
    print "something else happened"
0
adăugat

Programele twisted au, de obicei, un singur reactor . Rețineți că atunci când porniți ( .run() ) reactorul, execuția trece în interiorul bucla reactorului (și diversele evenimente pe care le-ați definit în codul dvs., cum ar fi connectionMade/code>, connectionLost() , dataReceived() etc sunt declanșate atunci când au loc acțiunile respective. Orice cod este după reactorul reactor.run() este executat numai după oprirea reactorului .

Deci, codul dvs. nu trece niciodată prima iterație a bucla pentru .

Încercați să mutați reactorul reactor.run() din bucla:

NUM_TABLES = 10

factories = [ ]
for i in range(0, NUM_TABLES):
    print i
    factory = Factory()
    factory.protocol = Socket
    factory.clients = []
    factories.append(factory)
    reactor.listenTCP(1025+i, factory)

# print "Blackjack server started"

reactor.run()

# whatever code you put here, is executed only **after reactor has stopped**
0
adăugat
Ok, atunci cred că este rezolvată atunci. Nu-mi vine să cred că nici măcar nu m-am gândit să mut această linie. Mulțumesc ypercube!
adăugat autor Alec, sursa
Am facut-o, si bucla merge de la 0 la 9 si am conectat la portul 1025, si a functionat. Conectat la 1031, a funcționat. Dar acum întrebarea mea este că ... este o singură fabrică care rulează în reactor și ascultă pe mai multe porturi sau este un reactor care rulează diferite fabrici pe diferite porturi?
adăugat autor Alec, sursa
Nu ar trebui să se țină deasupra setărilor de tot în bucla și nici să nu se execute reactorul?
adăugat autor Alec, sursa
Se va face buclă (de 10 ori) și apoi se va porni reactorul (o dată).
adăugat autor ypercubeᵀᴹ, sursa
Codul dvs. sugerează că ați construit 10 fabrici, câte unul în fiecare port.
adăugat autor ypercubeᵀᴹ, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.