代码:

    1. # 执行第一个协程程序
    2. asyncio.run(S.crawl_url())
    3. select_date = S.select_date()
    4. select_keyword = S.select_keyword(select_date) # 列表
    5. # 第二个协程
    6. loop = asyncio.get_event_loop()
    7. loop.run_until_complete(asyncio.wait([S.parse_html(url) for url in select_keyword]))
    8. loop.close()

    报错: raise RuntimeError(‘There is no current event loop in thread %r. ‘ RuntimeError: There is no current event loop in thread ‘MainThread’.

    翻译: 引发RuntimeError(‘线程%r中没有当前事件循环。’)
    在主线程中没有当前事件循环。

    出现错误原因:
    asyncio仅为主线程生成一个事件循环
    猜测:我在代码中,执行这个协程之前还有一个协程调用,下面的 loop = asyncio.get_event_loop() 并没有获取到事件循环,所以导致报错:在主线程没有事件循环。简单说,就是在同一线程中,第二个协程受到第一个的干扰。
    因为,当我将上面的第一个协程代码注释掉后,下面的代码就不会报错。

    解决办法:
    在第二个协程获取事件循环前添加下面两行代码

    1. new_loop = asyncio.new_event_loop()
    2. asyncio.set_event_loop(new_loop)

    修改后代码:

    1. # 执行第一个协程程序
    2. asyncio.run(S.crawl_url())
    3. select_date = S.select_date()
    4. select_keyword = S.select_keyword(select_date) # 列表
    5. # 第二个协程
    6. new_loop = asyncio.new_event_loop()
    7. asyncio.set_event_loop(new_loop)
    8. loop = asyncio.get_event_loop()
    9. loop.run_until_complete(asyncio.wait([S.parse_html(url) for url in select_keyword]))
    10. loop.close()