PythonAsyncioを使用してGPIO割り込みを待機します

ジャン

プログラムをTornadoからAsyncioに変換しようとしています最初のステップは、ここで説明する実際のasyncioイベントループを使用することです

このアプリケーションは組み込みLinuxマシンで実行され、sysfs / gpioサブシステム介してGPIOを使用しており、これらのGPIOのいくつかでは割り込みを待っています。次のようにして、これをTornadoIOLoopに直接統合することができました。

# Register with the queue
self.io_loop.add_handler(
    self.gpio._value_file, self._handle_interrupt, self.io_loop._EPOLLPRI | self.io_loop.ERROR
)

コードピースで_value_fileは、GPIOを読み取ることができるファイルへのファイルハンドルです。イベントEPOLLPRIは、そのGPIOで割り込みが使用可能になるたびに発生します。トルネードでは、これは非常にうまく機能します。_handle_interrupt割り込みが発生した直後に関数を呼び出します

私の問題は、これをネイティブのasyncioイベントループに変換できなかったことです。ファイルディスクリプタを見てのドキュメント私は、ファイルディスクリプタ上の汎用イベントマスク用の時計にリーダーとライターが、何を追加するための機能を見つけます。コードがCに入るので、コードに飛び込むことはできません。ただし、Tornadoレイヤーを見て、TornadoIOLoopからasyncioIOLoopに呼び出しを変換すると、次のようになります。

def add_handler(self, fd, handler, events):
    fd, fileobj = self.split_fd(fd)
    if fd in self.handlers:
        raise ValueError("fd %s added twice" % fd)
    self.handlers[fd] = (fileobj, stack_context.wrap(handler))
    if events & IOLoop.READ:
        self.asyncio_loop.add_reader(
            fd, self._handle_events, fd, IOLoop.READ)
        self.readers.add(fd)
    if events & IOLoop.WRITE:
        self.asyncio_loop.add_writer(
            fd, self._handle_events, fd, IOLoop.WRITE)
        self.writers.add(fd)

READフラグとWRITEフラグのみが変換され、他のすべてのフラグは無視されます。

誰かが、READイベントとWRITEイベント以外のファイル記述子のイベントを監視するためにasyncioを使用することが現在不可能であることを確認できますか?それとも私は何か間違ったことをしていて、実際に方法がありますか?

ジャン

私は今、これに対する解決策を自分で見つけました。情報の私の主な情報源となったのPython -チューリップのグループで、このスレッドコードのこの作品、私は少し採用しなければなりませんでした。

主な洞察は、POLLPRIイベントの監視に使用できるepoll自体がファイル記述子であるということです。POLLINepollが監視するFDでイベントが発生するたびに、epollファイル記述子はasyncioとを使用して監視できるイベントを生成add_readerます。したがって、直接登録する代わりに、手動でepoll構造を作成し、次のようにioloopに登録します。

self.epoll = select.epoll()
self.io_loop.add_reader(self.epoll.fileno(), self._handle_interrupt)

次に、実際の割り込みイベントがepoll構造に登録されます。

self.epoll.register(self.gpio._value_file, select.POLLPRI)

この時点で、割り込みイベントが_handle_interrupt関数で受信されます。イベントハンドラーでepoll構造を実際にポーリングするようにしてください。そうしないと、読み取りイベントが継続的に生成されます。

def _handle_interrupt(self):
    self.epoll.poll(0)
    ...

の場合と同様のイベントフラグフィルタリングを行うためselect、高レベルではなく低レベルの機能を使用することが重要です。次のコードは次のとおりですselectorsasyncioselectors.EpollSelector

def register(self, fileobj, events, data=None):
    key = super().register(fileobj, events, data)
    epoll_events = 0
    if events & EVENT_READ:
        epoll_events |= select.EPOLLIN
    if events & EVENT_WRITE:
        epoll_events |= select.EPOLLOUT
    try:
        self._epoll.register(key.fd, epoll_events)
    except BaseException:
        super().unregister(fileobj)
        raise
    return key

READとWRITEを除くすべてのイベントがフィルタリングされていることがわかります。したがって、高レベルのインターフェイスを使用してPOLLPRIイベントを監視することはできません。したがって、低レベルのインターフェイスを使用してください。

これが人々がこの問題につまずくのに役立つことを願っています。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

gpio-keys割り込みを使用して、RPi3の画面をウェイクアップします

分類Dev

R-PhantomJSを使用してRSeleniumにページが読み込まれるのを待機しています

分類Dev

JavaはSeleniumを使用してページが読み込まれるまで待機します

分類Dev

ユーザー入力を待機しているC ++割り込みスレッド

分類Dev

画像がJavaScriptに読み込まれるのを待機しています

分類Dev

CapybaraSitePrismを使用して画像が読み込まれるのを待ちます

分類Dev

ZeroMQを使用してGoで割り込みを処理する慣用的な方法

分類Dev

理由:「割り当て解除中に..を読み込もうとしています...:UISearchController:」

分類Dev

SSTPythonはページの読み込みを待機していません

分類Dev

AVRMCUでUSARTを介して送信するための割り込みの使用

分類Dev

javascript / CSSのみを使用して待機画像でページが読み込まれるまでUIをブロックする方法

分類Dev

メソッドを待ち、asyncioを使用して戻り値に変数を割り当てますか?

分類Dev

Python Selenium:1つの要素または別の要素が読み込まれるのを待機しています

分類Dev

Bashを読み取り、入力後も待機します

分類Dev

割り込みsmp_affinityを変更します

分類Dev

MATLABは割り込み時に現在の値を返します

分類Dev

discord.pyを使用してpythonasyncio loop.run_until_complete()を呼び出しても機能しませんか?

分類Dev

YarnApplicationState:ACCEPTED:AMコンテナの割り当て、起動、登録を待機しています

分類Dev

HtmlUnitDriverをクリックして、要素の再読み込みを待ちます

分類Dev

ArrayListを同期して待機します

分類Dev

PandasとspaCyを使用して文の埋め込み機能を抽出します

分類Dev

ctypesを使用してPythonで割り当てられたCでバッファを書き込み、Pythonで再度読み取ります

分類Dev

bokeh サーバー: ローカルホストを読み込んで待機しています

分類Dev

割り込みがメインの値を更新していません。割り込みをどのように設定すればよいですか?

分類Dev

コードが機能していないときに割り込み関数を実行できません

分類Dev

Pythonasyncioは待望のコルーチンをキャンセルします

分類Dev

IO :: Selectを使用して、読み取りまたは書き込みソケットの待機をブロックするにはどうすればよいですか?

分類Dev

mocha / chaiでwebdriverjsを使用してページが読み込まれるのを待ちます

分類Dev

phantomjsを使用してiframeがSeleniumPythonに読み込まれるのを待つ方法

Related 関連記事

  1. 1

    gpio-keys割り込みを使用して、RPi3の画面をウェイクアップします

  2. 2

    R-PhantomJSを使用してRSeleniumにページが読み込まれるのを待機しています

  3. 3

    JavaはSeleniumを使用してページが読み込まれるまで待機します

  4. 4

    ユーザー入力を待機しているC ++割り込みスレッド

  5. 5

    画像がJavaScriptに読み込まれるのを待機しています

  6. 6

    CapybaraSitePrismを使用して画像が読み込まれるのを待ちます

  7. 7

    ZeroMQを使用してGoで割り込みを処理する慣用的な方法

  8. 8

    理由:「割り当て解除中に..を読み込もうとしています...:UISearchController:」

  9. 9

    SSTPythonはページの読み込みを待機していません

  10. 10

    AVRMCUでUSARTを介して送信するための割り込みの使用

  11. 11

    javascript / CSSのみを使用して待機画像でページが読み込まれるまでUIをブロックする方法

  12. 12

    メソッドを待ち、asyncioを使用して戻り値に変数を割り当てますか?

  13. 13

    Python Selenium:1つの要素または別の要素が読み込まれるのを待機しています

  14. 14

    Bashを読み取り、入力後も待機します

  15. 15

    割り込みsmp_affinityを変更します

  16. 16

    MATLABは割り込み時に現在の値を返します

  17. 17

    discord.pyを使用してpythonasyncio loop.run_until_complete()を呼び出しても機能しませんか?

  18. 18

    YarnApplicationState:ACCEPTED:AMコンテナの割り当て、起動、登録を待機しています

  19. 19

    HtmlUnitDriverをクリックして、要素の再読み込みを待ちます

  20. 20

    ArrayListを同期して待機します

  21. 21

    PandasとspaCyを使用して文の埋め込み機能を抽出します

  22. 22

    ctypesを使用してPythonで割り当てられたCでバッファを書き込み、Pythonで再度読み取ります

  23. 23

    bokeh サーバー: ローカルホストを読み込んで待機しています

  24. 24

    割り込みがメインの値を更新していません。割り込みをどのように設定すればよいですか?

  25. 25

    コードが機能していないときに割り込み関数を実行できません

  26. 26

    Pythonasyncioは待望のコルーチンをキャンセルします

  27. 27

    IO :: Selectを使用して、読み取りまたは書き込みソケットの待機をブロックするにはどうすればよいですか?

  28. 28

    mocha / chaiでwebdriverjsを使用してページが読み込まれるのを待ちます

  29. 29

    phantomjsを使用してiframeがSeleniumPythonに読み込まれるのを待つ方法

ホットタグ

アーカイブ