什么是“运行时错误:线程 'Thread-2' 中没有当前事件循环”错误是什么意思?

问题描述

所以我一直在尝试使用 pyppeteer 制作一个简单的比特币价格检查器。它就像一个魅力,但每当我尝试将它实现到 Flask 时,我都会收到运行时错误

本质上,我想构建一个 web api 调用,每当我单击一个按钮时,它都会调用 webscraper 文件

如果有人能帮助指导我,那将不胜感激!

Flask 服务器

import webscraper
import asyncio

from flask import Flask,redirect,url_for,render_template,request

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html',title="Home")

@app.route('/api/scrape',methods=['POST'])
def scrape():
    webscraper.crypto_price('https://coinmarketcap.com/currencies/bitcoin/')
    return redirect(url_for('index'))

if(__name__ == '__main__'):
    app.run()

pyppeteer 文件

import asyncio
from pyppeteer import browser,launch

def write_to_file(file,text):
    f = open(file,'w')
    f.write(text)
    f.close

def crypto_price(link):
    async def main():
        browser = await launch()
        page = await browser.newPage()
        await page.setViewport({'width': 1920,'height': 1080})

        await page.goto(link,{'waitUntil': 'networkidle2'})
        data = await page.evaluate('''()=> {
            return {
                price: document.querySelector('#__next > div > div.main-content > div.sc-57oli2-0.dEqHl.cmc-body-wrapper > div > div.sc-16r8icm-0.hNsOU.container > div.sc-16r8icm-0.kXPxnI.container___lbFzk > div.sc-16r8icm-0.kXPxnI.priceSection___3kA4m > div.sc-16r8icm-0.kXPxnI.priceTitle___1cXUG > div').innerText
            }
        }''')

        await browser.close()

        write_to_file('./webscrape_result.txt',data['price'])

    asyncio.get_event_loop().run_until_complete(main())

错误

[2021-05-14 09:30:15,007] ERROR in app: Exception on /api/scrape [POST]
Traceback (most recent call last):
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\site-packages\flask\app.py",line 2447,in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\site-packages\flask\app.py",line 1952,in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\site-packages\flask\app.py",line 1821,in handle_user_exception
    reraise(exc_type,exc_value,tb)
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\site-packages\flask\_compat.py",line 39,in reraise
    raise value
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\site-packages\flask\app.py",line 1950,in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\site-packages\flask\app.py",line 1936,in dispatch_request     
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\gabri\Desktop\Python Web Scraper\server.py",line 14,in scrape
    webscraper.crypto_price('https://coinmarketcap.com/currencies/bitcoin/')
  File "C:\Users\gabri\Desktop\Python Web Scraper\webscraper.py",line 26,in crypto_price
    asyncio.get_event_loop().run_until_complete(main())
  File "C:\Users\gabri\AppData\Local\Programs\Python\python39\lib\asyncio\events.py",line 642,in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Thread-2'.

解决方法

您正在尝试在主线程以外的某个线程中运行 asyncio.get_event_loop() - 但是,asyncio 仅为主线程生成一个事件循环。

改为使用 new_event_loop

asyncio.new_event_loop().run_until_complete(main())

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...