首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让Telepot机器人在自己的线程中运行

让Telepot机器人在自己的线程中运行
EN

Stack Overflow用户
提问于 2019-09-12 22:54:31
回答 1查看 721关注 0票数 1

我使用telepot库用python编写了一个电报机器人。机器人本身正在工作。由于我还需要在运行机器人时定期执行一些其他工作(即在日志中写入内容),因此我希望机器人在其自己的线程中运行。

电报机器人的代码是一个名为telebot.py的文件,而线程代码位于一个名为plantbot.py的文件中

我首先尝试简单地创建一个调用我的run_bot()函数的新线程,但它不起作用,并给出了以下RuntimeError:

代码语言:javascript
复制
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "plantbot.py", line 12, in start_bot
    telebot.run_bot()
  File "/srv/plantbot/telebot.py", line 108, in run_bot
    loop = asyncio.get_event_loop()
  File "/usr/lib/python3.5/asyncio/events.py", line 671, in get_event_loop
    return get_event_loop_policy().get_event_loop()
  File "/usr/lib/python3.5/asyncio/events.py", line 583, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'Thread-1'.

下面是我用来做这件事的代码:

plantbot.py

代码语言:javascript
复制
def start_bot():
    telebot.run_bot()

bot = threading.Thread(target=start_bot, daemon=True)
bot.start()
print("Bot started...")
bot.join()

telebot.py

代码语言:javascript
复制
[lots of unrelated code]

bot = telepot.aio.Bot(TOKEN)

def run_bot():
    loop = asyncio.get_event_loop()
    loop.create_task(MessageLoop(bot, {'chat': on_chat_message, 'callback_query': on_callback_query}).run_forever())

    print('Listening ...')
    loop.run_forever()

然后我尝试了一些事件循环,直到我最终在我的主文件(plantbot.py)中创建了事件循环,如下所示:

plantbot.py

代码语言:javascript
复制
def start_bot(loop):
    telebot.run_bot(loop)

loop = asyncio.new_event_loop()
bot = threading.Thread(target=start_bot, args=(loop,),  daemon=True)
bot.start()
print("Bot started...")
bot.join()

telebot.py

代码语言:javascript
复制
[...]
bot = telepot.aio.Bot(TOKEN)

def run_bot(loop):
    loop.create_task(MessageLoop(bot, {'chat': on_chat_message, 'callback_query': on_callback_query}).run_forever())

    print('Listening ...')
    loop.run_forever()

我还尝试了另一个变体:

plantbot.py

代码语言:javascript
复制
def start_bot(loop):
    asyncio.set_event_loop(loop)
    loop.create_task(telebot.task.run_forever())
    loop.run_forever()

loop = asyncio.new_event_loop()
bot = threading.Thread(target=start_bot, args=(loop,),  daemon=True)
bot.start()
print("Bot started...")
bot.join()

telebot.py

代码语言:javascript
复制
[...]
bot = telepot.aio.Bot(TOKEN)

task = MessageLoop(bot, {'chat': on_chat_message, 'callback_query': on_callback_query})

不幸的是,这些都不起作用。

因此,我的问题是,如何在自己指定的线程中正确运行事件循环?具体地说:如何在自己的线程中运行电报机器人?

EN

回答 1

Stack Overflow用户

发布于 2019-09-16 22:32:58

我最终找到了一个解决方案,尽管它不是一个令人满意的解决方案:

我现在在主线程中运行机器人,并将其他所有内容放到其他线程中。它确实是这样工作的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57909420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档