2016-04-16 18 views
0

Ich erhalte die folgende Fehlermeldung, wenn sie versuchen mein Tornado-Server auf PyPy auszuführen:Tornado auf PyPy

/pypy3-2.4.0-osx64/site-packages/pkg_resources/__init__.py:80: UserWarning: Support for Python 3.0-3.2 has been dropped. Future versions will fail here. 

Wer weiß, was diese über spricht?

Auch warum normale Python-Interpreter die folgende Funktion erlauben:

@tornado.gen.coroutine 
    def get(self,id): 
     doc=[] 
     cursor = self.c.find({"_id":id}) 

     while (yield cursor.fetch_next): 
     doc.append(cursor.next_object()) 

     return doc 

jedoch PyPy beschwert sich über eine Rückkehr in einem Generator. Ich habe etwas gelesen und anscheinend ist der richtige Weg, nachzugeben statt zurückzukehren?

@tornado.gen.coroutine 
    def get(self,id): 
     doc=[] 
     cursor = self.c.find({"_id":id}) 

     while (yield cursor.fetch_next): 
     doc.append(cursor.next_object()) 

     yield doc 

ich geändert was dann der Fehler in PyPy loszuwerden ging zurück zu normalen Python und es abgestürzt ist.

+0

Welche Version von Python verwenden Sie? –

+0

Das ist kein Fehler, das ist eine Warnung von pkg_resources, die besagt, dass zukünftige Versionen, die auf neueren Python-Features basieren, nicht auf der verwendeten pypy-Version laufen (pypy3 2.4 bietet nur Kompatibilität mit python3.2.5). Das bedeutet nur, dass Sie keine neueren Versionen von setuptools verwenden können. – mata

+0

Bevor ich zu pypy umziehen wollte, lief ich: ** Python 3.4.3 (v3.4.3: 9b73f1c3e601, 23.02.2015, 02:52:03) Ich habe pypy Python 3.2.5 kompatibles PyPy3 2.4.0 heruntergeladen ** Ok so Python 3.4 könnte Funktionen haben, die ich benutze, die nicht mit dieser Pypy kompatibel sind, weil es nur bis Python 3.2 unterstützt. Ist das richtig? –

Antwort

3

Die aktuelle Version von pypy3 basiert auf cpython 3.2. Das ist alt genug, dass viele Pakete Unterstützung dafür fallengelassen haben. Tornado unterstützt cpython 3.2 nicht mehr, aber wir unterstützen pypy3 (der Unterschied ist die Unterstützung für Unicode-Literale u"", die in pypy3 vorhanden ist, aber erst 3.3 wieder zu cpython hinzugefügt wurde).

Sie können return nicht durch yield in einer Coroutine ersetzen; Dies wird eine erhöhen. Stattdessen müssen Sie return x durch raise gen.Return(x) ersetzen. Es war nicht möglich, return und yield in der gleichen Funktion bis Python 3.3 zu mischen.

+0

Danke Ben alle macht Sinn eine Seite, wenn Sie einen Tornado-Webserver optimieren möchten, ohne in Releases zurückzugehen (oder nach fiesen Hacks suchen, die versuchen, eine ältere Version von PyPy zu bekommen) Was würden Sie über das Ausführen von mehr Prozessen mit nginx hinaus tun? Cython-Optimierung als nächster Schritt? –

+0

Beginnen Sie immer mit der Profilerstellung, um herauszufinden, wo Ihre Engpässe sind.Cython ist großartig, wenn Sie einige relativ kleine Hotspots haben, aber meiner Erfahrung nach ist es schwierig, damit signifikante Gewinne aus einer Tornado-App zu erzielen. Ich würde in der Regel sofort weitere Maschinen hinzufügen, sobald die niedrig-hängenden Optimierung Obst ausgewählt wurde. –

+0

Ausgezeichnet! Che Bens. –