カスタムタスクをaiogramexecutorに統合する方法は?

ちゃん
import asyncio
from threading import Thread
from datetime import datetime
from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = ''

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

chat_ids = {}

@dp.message_handler()
async def echo(message: types.Message):
    # old style:
    # await bot.send_message(message.chat.id, message.text)

    chat_ids[message.message_id] = message.from_user
    text = f'{message.message_id} {message.from_user} {message.text}'
    await message.reply(text, reply=False)


async def periodic(sleep_for, queue):
    while True:
        await asyncio.sleep(sleep_for)
        now = datetime.utcnow()
        print(f"{now}")
        for id in chat_ids:
            queue.put_nowait((id, f"{now}"))
            # await bot.send_message(id, f"{now}", disable_notification=True)


def run_tick(queue):
    newloop = asyncio.new_event_loop()
    asyncio.set_event_loop(newloop)
    asyncio.run(periodic(3, queue))


if __name__ == '__main__':
    queue = asyncio.Queue()
    Thread(target=run_tick, args=(queue,), daemon=True).start()
    executor.start_polling(dp, skip_updates=True)

イベントが発生したが今のところ失敗した場合、bot.send_messageで登録ユーザーにメッセージを送信したい。これが私が試したものです。

  1. bot.send_messageは、別のスレッドから呼び出されたためにクラッシュします。(タイムアウトコンテキストマネージャーはタスク内で使用する必要があります)
  2. そのため、キューを使用してこれを回避しようとしましたが、自分のタスクをエグゼキュータに追加する方法はありません。

これを行う簡単な方法はありますか?


編集:2020-1-3

@ user4815162342による作業例を次に示します。

import asyncio
from datetime import datetime
from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = ''

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

chat_ids = {}

@dp.message_handler()
async def echo(message: types.Message):
    chat_ids[message.from_user.id] = message.from_user
    text = f'{message.message_id} {message.from_user} {message.text}'
    await message.reply(text, reply=False)

async def periodic(sleep_for):
    while True:
        await asyncio.sleep(sleep_for)
        now = datetime.utcnow()
        print(f"{now}")
        for id in chat_ids:
            await bot.send_message(id, f"{now}", disable_notification=True)

if __name__ == '__main__':
    dp.loop.create_task(periodic(10))
    executor.start_polling(dp)

user4815162342

最初の問題は、別のスレッドからasyncioコードを呼び出そうとしたことでした。結果として生じるエラーを修正するために、追加のスレッドを保持しながら新しいイベントループを作成しました。ことわざにあるように、今あなたは2つの問題を抱えています。

キューから読み取るコードがないため、キューのアイデアは未完成に見えます。また、非同期キューはイベントループ間またはスレッド間で共有されるように設計されていないため、存在したとしても機能しません。混乱を解消するには、イベントループ内から定期的な更新を実行する方法を見つける必要があります。つまり、この仮定を再検討します。

しかし、自分のタスクをエグゼキュータに追加する方法はありません。

ソース見ると、Executorディスパッチャからイベントループを取得しているように見えloopます。ディスパッチャは、パブリックにアクセス可能な属性にイベントループを保持しています。つまりcreate_task、そのループでメソッドを呼び出すだけでタスクを作成できます例えば:

if __name__ == '__main__':
    dp.loop.create_task(periodic())
    executor.start_polling(dp, skip_updates=True)

これperiodicで、最初の試みと同じように定式化できます。

async def periodic(sleep_for, queue):
    while True:
        await asyncio.sleep(sleep_for)
        now = datetime.utcnow()
        for id in chat_ids:
            await bot.send_message(id, f"{now}",
                                   disable_notification=True)

を使用していないため、これをテストしていないことに注意してくださいaiogram対処する必要があるかもしれない潜在的な問題は、chat_ids辞書がmessage.message_idキーとして含まているように見えるのに対し、をbot.send_message受け入れることmessage.chat.idです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

カスタムフレームワークをバックボーンに統合する方法は?

分類Dev

カスタムモードを使用してAceEditorに構文チェックを統合する方法は?

分類Dev

CSSクラスを1つのカスタムクラスに統合する

分類Dev

カスタムサービスをapacheknox0.9.1に統合する方法

分類Dev

カスタムPHPスクリプトをdrupalWebサイトに統合する

分類Dev

phpListをカスタムページに統合する

分類Dev

カスタムスクリプトをイナゴヘルムチャート安定/イナゴに統合する方法は?

分類Dev

lodashカスタムビルドをプロジェクトに統合する方法

分類Dev

AngularプロジェクトをSquarespaceカスタムテンプレートに統合する方法

分類Dev

統合テスト中にカスタムスプリングブートスターターをロード可能にする方法は?

分類Dev

依存性注入をカスタムデコレータと統合する方法

分類Dev

カスタムModernizrビルドをAngularプロジェクトに統合するための最良の方法は何ですか?

分類Dev

ミスリルにカスタムコンテキストメニューを統合する方法

分類Dev

カスタムブロック暗号をJavaCardフレームワークに統合する

分類Dev

Apache igniteをSparkデータフレームと統合する方法とSparkデータフレームにインデックスを適用する方法は?

分類Dev

カスタムSpringBootスタイルのスターターライブラリの自動構成を統合テストする方法は?

分類Dev

カスタムアスペクト比でプロジェクトを統一する方法は?

分類Dev

OpenFSTをtensorflowカスタム操作にリンクする方法は?

分類Dev

カスタムAbstractProcessorを作成してEclipseと統合する

分類Dev

カスタムassert()をAddressSanitizerと統合する

分類Dev

カスタム認証プロバイダーをIdentityServer4に統合する方法

分類Dev

CPUを多用するタスクを処理するためにJavaをnodejsと統合する方法は?

分類Dev

フラスコとオクタの統合をテストする方法は?

分類Dev

1つのコマンドの出力をElixirのミックスタスクに統合する方法は?

分類Dev

カスタムリストクラスをjsonに変換する方法は?

分類Dev

LinQでカスタムオブジェクトを合計する方法は?

分類Dev

Firebaseモバイル認証をカスタムlaravel-Mysqlバックエンドと統合するにはどうすればよいですか?

分類Dev

infusionsoftにカスタムチェックボックスを追加する方法は?

分類Dev

Neo4jデータベース、NestJSフレームワーク、GraphQLを統合する方法は?

Related 関連記事

  1. 1

    カスタムフレームワークをバックボーンに統合する方法は?

  2. 2

    カスタムモードを使用してAceEditorに構文チェックを統合する方法は?

  3. 3

    CSSクラスを1つのカスタムクラスに統合する

  4. 4

    カスタムサービスをapacheknox0.9.1に統合する方法

  5. 5

    カスタムPHPスクリプトをdrupalWebサイトに統合する

  6. 6

    phpListをカスタムページに統合する

  7. 7

    カスタムスクリプトをイナゴヘルムチャート安定/イナゴに統合する方法は?

  8. 8

    lodashカスタムビルドをプロジェクトに統合する方法

  9. 9

    AngularプロジェクトをSquarespaceカスタムテンプレートに統合する方法

  10. 10

    統合テスト中にカスタムスプリングブートスターターをロード可能にする方法は?

  11. 11

    依存性注入をカスタムデコレータと統合する方法

  12. 12

    カスタムModernizrビルドをAngularプロジェクトに統合するための最良の方法は何ですか?

  13. 13

    ミスリルにカスタムコンテキストメニューを統合する方法

  14. 14

    カスタムブロック暗号をJavaCardフレームワークに統合する

  15. 15

    Apache igniteをSparkデータフレームと統合する方法とSparkデータフレームにインデックスを適用する方法は?

  16. 16

    カスタムSpringBootスタイルのスターターライブラリの自動構成を統合テストする方法は?

  17. 17

    カスタムアスペクト比でプロジェクトを統一する方法は?

  18. 18

    OpenFSTをtensorflowカスタム操作にリンクする方法は?

  19. 19

    カスタムAbstractProcessorを作成してEclipseと統合する

  20. 20

    カスタムassert()をAddressSanitizerと統合する

  21. 21

    カスタム認証プロバイダーをIdentityServer4に統合する方法

  22. 22

    CPUを多用するタスクを処理するためにJavaをnodejsと統合する方法は?

  23. 23

    フラスコとオクタの統合をテストする方法は?

  24. 24

    1つのコマンドの出力をElixirのミックスタスクに統合する方法は?

  25. 25

    カスタムリストクラスをjsonに変換する方法は?

  26. 26

    LinQでカスタムオブジェクトを合計する方法は?

  27. 27

    Firebaseモバイル認証をカスタムlaravel-Mysqlバックエンドと統合するにはどうすればよいですか?

  28. 28

    infusionsoftにカスタムチェックボックスを追加する方法は?

  29. 29

    Neo4jデータベース、NestJSフレームワーク、GraphQLを統合する方法は?

ホットタグ

アーカイブ