kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

rasberry piとnfc読み取りプログラム ~threadにしてみる~

f:id:kazu22002:20200928064534p:plain

※ 更新:2020-11-07 サンプルコードがなかったため追加

nfcのプログラムが読み込み待ち状態から動作しないことに困っているため解決方法を模索中です。

とりあえずプロセス自体を別に新しく作ることでmainのプログラムに影響しないようしたら解決できないか考え、threadを試してみることにしました。

thread

pythonのthreadがどれくらい機能があるのかやったことがないためかなりの苦戦を覚悟しましたが、結構シンプルでした。

threadのサンプル

import threading

def read():
    print('read')

if __name__ == '__main__':
    # スレッドに read 関数を渡す
    t1 = threading.Thread(name='read', target=read)
    # スレッドスタート
    t1.start()

    print('started')
    t1.join()

サンプル作成

もともとGUIを作る予定があったため、カード読み取りはthreadにしたい欲がありました。

threadを学ぶのもいい機会です。

import threading
import nfc

def read():
    clf = nfc.ContactlessFrontend('usb')
    try:
        tag = clf.connect(rdwr={'on-connect': lambda tag: False})
        print(tag)
    finally:
        clf.close()

if __name__ == '__main__':
    # スレッドに read 関数を渡す
    t1 = threading.Thread(name='read', target=read)
    # スレッドスタート
    t1.start()

    print('started')
    t1.join()

結果:だめでした

thread側で待ち状態になっており、mainプログラムが終了まで行かないことが判明し、意味がないことがわかりました。

強制終了してもthread側がプロセスに残ったり、悪化しました。

雑記

pythonのthreadを触る機会になりましたが、感想としてはイメージより簡単でした。

ただgolangのgoroutineとchannelを触った後に感じることは、不便だなと感じてしまったのはいい機会でした。

golangのthreadはかなり便利だと思います。パラメータ渡しや同期処理や終了処理など必要なことが簡単にできますね。

言語の特徴って重要ですね。