2017-12-03 19 views
2

私は死んでしまったように見えます。 asyncioループの中でスパイダースパイダーを実行する方法はありますか?たとえば、以下のコードで:asyncioのループ内でスクーピースパイダーを実行するには?

エラーに私をリード
import asyncio 
from scrapy.crawler import CrawlerProcess 
from myscrapy import MySpider 
import scrapy 

async def do_some_work(): 
    process = CrawlerProcess() 
    await process.crawl(MySpider) 

loop = asyncio.get_even_loop() 
loop.run_until_complete(do_some_work()) 

raise TypeError('A Future, a coroutine or an awaitable is required') 
TypeError: A Future, a coroutine or an awaitable is required 

私は後に別のコルーチンがあるはず待つことを理解します。それをバイパスし、まだ非同期に動作させる方法はありますか?ありがとうございます

+0

なぜそれは待っていると動作すると思いますか?すべてのメソッドが非同期として動作するわけではありません。 – furas

答えて

0

全体の治療は同期コードです。ブロッキングが発生するたびに、実行リソースをselectループに戻す非同期メカニズム(コルーチン)はありません。 主なブロックはネットワーク要求です。 libsのscrapyはasyncioをサポートしていません。だから、元のネットワークライブラリを置き換えるasyncioやaiohttpを実装するために、scrapyのソースコードを開いて、それがうまくいくかもしれません。しかし、それらのライブラリの上には、複雑なねじれモジュールもあります。 (asyncioのようなものだが、asyncioほど高速ではない(Python 2以降)。asyncioを使って新しいフレームワークを構築するよりも難しいかもしれない。

関連する問題