2016-04-16 2 views
0

Я получаю следующее сообщение об ошибке при попытке запустить мой смерч сервер на PyPy:Торнадо на 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. 

Кто-нибудь знает, что это говорит о?

Также почему нормальный интерпретатор Python позволяет следующую функцию:

@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 

Однако PyPy жалуется, используя возврат внутри генератора. Я прочитал кое-что, и, по-видимому, правильным способом является выход вместо возвращения?

@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 

Я изменил уступать, чтобы избавиться от ошибок в PyPy затем вернулся к нормальному питону и он разбился.

+0

Какую версию Python вы используете? –

+0

Это не ошибка, это предупреждение, выданное pkg_resources, в котором говорится, что будущие версии, основанные на новых функциях python, не будут работать на используемой версии pypy (pypy3 2.4 обеспечивает только совместимость с python3.2.5). Это означает, что вы не сможете использовать более новые версии setuptools. – mata

+0

Прежде чем пытаться перейти на pypy, я запускал: ** Python 3.4.3 (v3.4.3: 9b73f1c3e601, Feb 23 2015, 02:52:03) Я загрузил pypy Python 3.2.5, совместимый с PyPy3 2.4.0 ** Хорошо, поэтому У python 3.4 могут быть функции, которые я использую, которые не совместимы с этим pypy, потому что он поддерживает только python 3.2. Правильно ли это? –

ответ

3

Текущий выпуск pypy3 основан на cpython 3.2. Это достаточно устарело, что многие пакеты отказались от поддержки. Tornado больше не поддерживает cpython 3.2, но мы поддерживаем pypy3 (разница в поддержке u"" unicode литералов, которая присутствует в pypy3, но не была добавлена ​​к cpython до 3.3).

Вы не можете заменить return на yield в сопрограмме; это поднимет BadYieldError. Вместо этого вы должны заменить return x на raise gen.Return(x). Невозможно было смешать return и yield в той же функции до python 3.3.

+0

Спасибо, Бен все имеет смысл. в стороне, если бы вы хотели оптимизировать веб-сервер tornado, не обращаясь назад в выпусках (или искали неприятные взломы, пытаясь получить более старую версию PyPy). Что бы вы хотели сделать, помимо запуска большего количества процессов с nginx? Оптимизация Cython в качестве следующего шага? –

+0

Всегда начинайте с профилирования, чтобы выяснить, где ваши узкие места. Cython замечательный, если у вас есть несколько относительно маленьких горячих точек, но по моему опыту трудно использовать его, чтобы получить значительную прибыль от приложения Tornado. Я бы обычно пошел прямо на добавление большего количества машин, как только были выбраны фрукты с низкой подвеской. –

+0

Отлично! ers Бен. –