带有Telethon的Python烧瓶

时间:2018-07-12 17:26:46

标签: python flask runtime-error python-asyncio telethon

我想从我的Flask Web App中使用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()

2 个答案:

答案 0 :(得分:1)

基本上,这是由于Python的GIL。如果您不想深入研究request.getHeader ("Referer")的内部结构,只需asyncio,您就可以使用了。

答案 1 :(得分:0)

这是我在尝试后学到的东西。首先,确保你知道 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,它没有完全转换为同步,它使用上述模式等待所有方法。