1

我想从我的 Flask Web 应用程序中使用 Telethon Telegram API。但是当我运行它时,我收到以下错误:

RuntimeError:线程 'Thread-1' 中没有当前事件循环。

我认为 asyncio 存在一些问题。但我不确定。

这是我的代码

#!/usr/bin/python3

from flask import Flask
from telethon import TelegramClient
from telethon import sync

app = Flask(__name__)

@app.route('/')
def index():
    api_id = XXXXXX
    api_hash = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    client = TelegramClient('XXXXXX', api_id, api_hash)
    client.start()
    return 'Index Page'

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

3 回答 3

1

基本上,这是由于 Python 的 GIL。如果您不想深入研究asyncio 内部结构,pip3 install telethon-sync那么您就可以开始了。

于 2018-07-18T19:07:02.937 回答
1

这是我在尝试后学到的。首先,确保你知道 asyncio 是什么,它真的超级简单。然后,您可以提高工作效率。

Telethon 使用 asyncio,这意味着当您调用阻塞方法时,您必须等到协程完成。

client.loop ###Doesn't work inside flask, it might have to do with threads.

您可以轻松导入 asyncio 并使用主循环。像这样。

import asyncio
loop = asyncio.get_event_loop()

现在您已准备好等待协程完成。

  1. 创建一个新的异步函数并将 await 添加到阻塞方法中。
  2. 使用主事件循环执行代码。

这是一个代码示例。

async def getYou():
    return await client.get_me()

@app.route("/getMe", methods=['GET'])
def getMe():
    return {"MyTelegramAccount": loop.run_until_complete(getYou())}

还有一件事情。不要使用telethon.sync,它没有完全转换为同步,它使用上面的模式它等待所有的方法。

于 2021-02-27T21:00:03.773 回答
0

在您的位置,我会考虑使用Quart,这是 Telethon 自己的文档中建议的,它更容易。

于 2021-11-13T18:22:40.563 回答