首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RuntimeError:事件循环关闭

RuntimeError:事件循环关闭
EN

Stack Overflow用户
提问于 2016-06-12 19:01:24
回答 1查看 6.1K关注 0票数 7

我有两个脚本,scraper.py和db_control.py。在scraper.py中,我有这样的东西:

代码语言:javascript
复制
...
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中:

代码语言:javascript
复制
from scraper import scrape
...
while new < 15:
    data = scrape(category, field, pages, search, use_proxy, proxy_file)
    ...
...

从理论上讲,刮板应该以未知的方式启动,直到获得足够的数据。但是,当new不是> 15时,就会发生这样的错误:

代码语言:javascript
复制
  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()存在一些问题,我尝试过,但是没有什么改变。我怎么才能解决这个问题?当然,这些只是我代码的片段,如果您认为问题可能在其他地方,那么完整的代码是可用的这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-12 20:36:02

方法run_until_completerun_foreverrun_in_executorcreate_taskcall_at显式检查循环并在其关闭时抛出异常。

引用docs - BaseEvenLoop.close

这是幂等的和不可逆的

除非你有一些(好的)理由,否则你可以简单地省略这一行:

代码语言:javascript
复制
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 ]

如果您希望每次都有一个全新的循环,则不需要手动创建它,并将其设置为默认值:

代码语言:javascript
复制
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 ]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37778019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档