我有两个脚本,scraper.py和db_control.py。在scraper.py中,我有这样的东西:
...
def scrape(category, field, pages, search, use_proxy, proxy_file):
...
loop = asyncio.get_event_loop()
to_do = [ get_pages(url, params, conngen) for url in urls ]
wait_coro = asyncio.wait(to_do)
res, _ = loop.run_until_complete(wait_coro)
...
loop.close()
return [ x.result() for x in res ]
...在db_control.py中:
from scraper import scrape
...
while new < 15:
data = scrape(category, field, pages, search, use_proxy, proxy_file)
...
...从理论上讲,刮板应该以未知的方式启动,直到获得足够的数据。但是,当new不是> 15时,就会发生这样的错误:
File "/usr/lib/python3.4/asyncio/base_events.py", line 293, in run_until_complete
self._check_closed()
File "/usr/lib/python3.4/asyncio/base_events.py", line 265, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed但是,如果我只运行了一次scrape(),脚本就可以正常工作了。所以我想重新创建loop = asyncio.get_event_loop()存在一些问题,我尝试过这,但是没有什么改变。我怎么才能解决这个问题?当然,这些只是我代码的片段,如果您认为问题可能在其他地方,那么完整的代码是可用的这里。
发布于 2016-06-12 20:36:02
方法run_until_complete、run_forever、run_in_executor、create_task、call_at显式检查循环并在其关闭时抛出异常。
引用docs - BaseEvenLoop.close
这是幂等的和不可逆的
除非你有一些(好的)理由,否则你可以简单地省略这一行:
def scrape(category, field, pages, search, use_proxy, proxy_file):
#...
loop = asyncio.get_event_loop()
to_do = [ get_pages(url, params, conngen) for url in urls ]
wait_coro = asyncio.wait(to_do)
res, _ = loop.run_until_complete(wait_coro)
#...
# loop.close()
return [ x.result() for x in res ]如果您希望每次都有一个全新的循环,则不需要手动创建它,并将其设置为默认值:
def scrape(category, field, pages, search, use_proxy, proxy_file):
#...
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
to_do = [ get_pages(url, params, conngen) for url in urls ]
wait_coro = asyncio.wait(to_do)
res, _ = loop.run_until_complete(wait_coro)
#...
return [ x.result() for x in res ]https://stackoverflow.com/questions/37778019
复制相似问题