我想从我的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()
答案 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()
现在您已准备好等待协程完成。
这是一个代码示例。
async def getYou():
return await client.get_me()
@app.route("/getMe", methods=['GET'])
def getMe():
return {"MyTelegramAccount": loop.run_until_complete(getYou())}
还有一件事。不要使用 Telethon.sync,它没有完全转换为同步,它使用上述模式等待所有方法。