estin / pomp

Screen scraping and web crawling framework
https://pomp.readthedocs.org
Other
60 stars 10 forks source link

* [asyncio] `BasePipeline.process` can be coroutine #7

Open affmaker opened 7 years ago

affmaker commented 7 years ago

Когда можно ожидать?

estin commented 7 years ago

Думаю не загарами. И можно ожидать в течении 1-2 недель. С другой стороны Вам точно нужны асинхронные pipeline.process?

По задумке pipeline должен как можно быстрее передать результат и не тормозить. И в большинстве случаев достаточно сделать так:

import asyncio

class SomePipeline(object):

    async def producer_send(self, crawler, item):
         pass

    def process(self, crawler, item):
        asyncio.ensure_future(self.producer_send(crawler, item))
estin commented 7 years ago

В мастере начал 0.3.0 версию. Теперь для asyncio можно писать Pipeline,Middleware,Crawler корутинами и использовать async/await синтаксис. см. https://github.com/estin/pomp/blob/master/CHANGES.rst#version-030

affmaker commented 7 years ago

Тест 0.3.0 версии python3.5 e04_aiohttp.py Traceback (most recent call last): File "e04_aiohttp.py", line 82, in <module> from pomp.contrib.asynciotools import AioPomp File "pomp/contrib/asynciotools/__init__.py", line 52, in <module> class AioPomp(SyncPomp): File "pomp/contrib/asynciotools/__init__.py", line 115, in AioPomp exec('\n'.join(switch_to_asyncio(SyncPomp._process_items))) File "<string>", line 15 SyntaxError: 'yield' inside async function

estin commented 7 years ago

Нужен питон минимум версии 3.6, а именно нужна поддержка PEP 525: Asynchronous Generators https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep525

~/p/pomp (master|✔) $ python --version
Python 3.6.0
~/p/pomp (master|✔) $ python examples/e04_aiohttp.py | tail -2
Statistics:
 requests/responses/exceptions = 2/2/0

P.S. Надо бы об этом явно заявить в доке )