问题描述
我有一个依赖于Scrapy 2.3.0的项目,该项目使用Twisted 20.3.0作为其网络引擎。我正在尝试将Scrapy使用的基于回调的方法转换为协程,并使用Python的asyncio运行它。要发出HTTP请求,需要创建一个新的Request对象,该对象带有一个pip install -U scipy
处理一个成功案例,一个callback
处理失败。因此,我编写了以下方法进行转换:
errback
但是当引发异常时,我只得到import asyncio
from scrapy import http
# ...
async def request(
self,url: str,method: str,*,headers: dict = None,cookies: dict = None,body: str = None,Meta: dict = None
) -> http.Response:
fut = asyncio.get_running_loop().create_future()
def fire_success(response):
if not fut.done():
fut.set_result(response)
return None
def fire_failure(failure):
if not fut.done():
fut.set_exception(failure.value)
return None
scrapy_request = http.Request(
url,method=method,headers=headers,cookies=cookies,body=body,Meta=Meta,callback=fire_success,errback=fire_failure,dont_filter=True
)
self._crawler.engine.crawl(scrapy_request,self._crawler.spider)
return await fut
之前的回溯,这是否意味着return await fut
被设置在
failure.value
没有回溯吗?
以下示例重现了该问题:
def fire_failure(failure):
if not fut.done():
fut.set_exception(failure.value)
return None
我通过调用import asyncio
async def a():
await asyncio.sleep(2)
raise Exception('Hello from a()')
async def b():
await a()
async def c(fut: asyncio.Future):
try:
await b()
except Exception as e:
fut.set_exception(e.with_traceback(None))
async def d(fut):
return await fut
async def main():
fut = asyncio.get_running_loop().create_future()
await asyncio.gather(d(fut),c(fut))
asyncio.run(main())
删除了回溯,这是不完整的回溯(它缺少对e.with_traceback(None)
的调用):
await b()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)