1

テレポット ライブラリを使用して、python でテレグラム ボットを作成しました。ボット自体は機能しています。ボットの実行中に定期的に行う必要がある他の作業 (つまり、ログへの書き込み) もあるため、ボットを独自のスレッドで実行する必要があります。

電報ボットのコードはファイルtelebot.pyであり、スレッドコードはplantbot.py

最初に、関数を呼び出す新しいスレッドを単純に作成しようとしましたが、run_bot()機能せず、次の RuntimeError が発生しました。

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

def start_bot():
    telebot.run_bot()

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

telebot.py

[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

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

[...]
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

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

[...]
bot = telepot.aio.Bot(TOKEN)

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

残念ながら、これらのどれも機能しませんでした。

したがって、私の質問は、指定された独自のスレッドでイベントループを適切に実行するにはどうすればよいですか? 具体的には、電報ボットを独自のスレッドで実行するにはどうすればよいですか?

4

1 に答える 1