わいずふぁくとりいがプログラムの話題をウィキします。

マルチスレッドで制御する〔プログラミング事始め-4〕


 なんとか、チャタリングする様子を見てみたいと思っているわけであるが、Pythonでマルチスレッドができるという情報を見つけたので、試してみる。
 ThreadPoolExecutorというものを使ってみる。threadingでもよさそうであるが・・
 今回は、プロセスをまたがるマルチスレッドは考えない。

 threading.Lock()を使って、ロックもちゃんとかけられる。sleepはtimeを使ってかけられる。

プログラム


 スイッチを押したときと、離したときにカウントが上がるプログラムを作る。
 それを3秒ごとに表示する。表示する際に2で割っているので、押した回数が表示される。

 結局チャタリングはそう簡単には捕まえられない。一度だけ発生したような気がしたが、定かではない。


ハマった点

インクリメント演算

 pythonではインクリメント演算子が使えなかった。「count += 1」と書かないといけない。
 「count--」はエラーになるのだが、「++count」は何故かエラーにならないので、ハマってしまた。
グローバル変数

 関数内からグローバル変数へアクセスするには「global count」のような文がいる。これにもハマった。
 関数内の変数はすべてローカス変数のようだ。

全リスト


sw_count
#!/usr/bin/env python3

from concurrent.futures import ThreadPoolExecutor
import RPi.GPIO as GPIO
import threading
import time

def sw_count():
  global count
  global lock
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(3, GPIO.IN)
  last = sw = GPIO.input(3)
  while True:
    sw = GPIO.input(3)
    if sw != last:
      lock.acquire()
      count += 1
      lock.release()
      last = sw

count = 0
lock = threading.Lock()
executor = ThreadPoolExecutor()
executor.submit(sw_count)

while True:
  time.sleep(3)
  lock.acquire()
  pcnt = count
  lock.release()
  print(pcnt/2)

(参考)

Pythonのthreadingとmultiprocessingを完全理解
https://qiita.com/kaitolucifer/items/e4ace07bd8e11...

[Python] スレッドで実装する
https://qiita.com/tchnkmr/items/b05f321fa315bbce4f...

Pythonの並行処理を理解したい [マルチスレッド編]
https://zenn.dev/ryo_kawamata/articles/python-conc...

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます