「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



Pythonで、ちょっと気になってたので、なんか調べて
みた。thread処理。

用途としては、一つは、マイコンでいうところの
周期的なタイマ割り込み処理みたいなやつ。
もう一つは、やっぱりマルチコア使って並列処理
させるとき。

深く理解するのはともかく、ざっくり気になってる
ところを調べてみた。

threadingっていうライブラリをインポートして、
ゴニョゴニョするとできるみたい。


まずは、周期的な処理の話を調べる。

どうやら、関数を1回呼び出すなりして、そのとき
に、関数自身が、何秒後に自分を呼び出すかを設定
することで、周期的に呼び出される仕組みみたい。
例えばこんな。
(例によって、不等号は全角に置き換え)

import threading
import time

q = 0
def f():
    global q
    q += 1
    print (q)
    if q < 10:
      threading.Timer(1, f).start()


f()
time.sleep(15)
print (q)


関数内からは、グローバル変数を参照することは
可能といえば可能なんだけど、そのときに参照される
物理メモリは、グローバル変数と同じ名前でコピー
された別メモリらしい。なので値は見れるけど、
更新してもグローバル変数自体の値は変わらない。
変えたい場合は、こういう風に「global」って
付けて教えてやるといいみたい。

ただ、そうすると、複数スレッドで更新掛けると、
スレッドセーフにならないので、Lockを掛ける
ってことみたい。AVRのgccでいう、sei()、cli()
みたいなもんかな。

例えばこんな感じ。

import threading
import time

counter = 0
end_flag = 0

def tick():
  global counter
  print ("counter start.")
  with threading.Lock():
    counter += 1
    time.sleep(0.1)
  print ("thread end.")
  if end_flag == 0:
    threading.Thread(target = tick).start()


def read():
  global counter, end_flag
  print ("reader start.")
  with threading.Lock():
    print ("counter = %d" % counter)
  if counter < 100:
    threading.Timer(2, read).start()
  else:
    end_flag = 1


t1 = threading.Thread(target = tick)
t1.start()
t2 = threading.Timer(2, read)
t2.start()

print ("*** start with %d" % counter)

t1.join()
t2.join()
print ("*** end with %d" % counter) # not to work


あまり考えず、調べずに、ひとまず動くコードって
感じで作ってみたので、やたらグローバル変数を
使ってて読みにくいプログラムになっちゃった。

片方の関数を0.1秒ごとに呼び出してカウントアップ
しつつ、もう1個の関数を2秒おきで呼び出して、
その関数でカウンタを参照。

参照した値が100に達してたら、フラグを立てて
自分のスレッドを再起動させず、同時に、グローバル
変数を通して、もう1個のスレッドも終了させる
という仕組みにしてみた。

とりあえずその通りに動くんだけど、両方のスレッド
が終わるのを待ってから、後続を実行したい…と
思ってるんだけど、こういうケースはjoinではだめ
みたい。とりあえずここまで。



もう1個の使い方としては、やっぱり大量のデータを
並列処理したい、みたいな場合。
そういう場合は、キューを使って、実行結果を
キューに放り込んで…みたいなことをやるみたい。

http://d.hatena.ne.jp/sxhxtxa/20121107/1352272137

キュー自体は、スレッドセーフなの?セーフじゃ
なくてもいいの?





なんとなくここんところ気になってるMSX。
あれこれ検索。

http://blog.goo.ne.jp/usada109/e/79d3a994c7d57821624bd76e301dee21

DE0-nanoで、ワンチップMSXと同じこと出来てる
みたい。

そういえば、MSXも、FPGAだけじゃなく、Raspberry Pi
に押し込んじゃうっていう手もあるんじゃないの?
なんて思って、検索してみると、

http://eagle0wl.hatenadiary.jp/entry/2016/09/20/000000

やっぱり当たり前のように存在するんだな。
RetroPieって、こういうときに使うのか。
どこのご家庭にも2~3台はあるRaspberry Piが
あっという間にレトロPCに。

なんといっても、MSXだけじゃなく、PC88とか色々
できるみたいだな。へぇ。



https://twitter.com/iruka3/status/853918862588366848

Human68kがないのなら、
    Humanx86をつくればいいじゃない。
(byマリーアントワネット)

オイラは、友達んちでゲームやってあそんだりした
ことはあるんだけど、Human68kのなんたるかはよく
わかってないんだよな。

OSっていうより、68kはハードが良かったおかげだろう
からなぁ。





http://www.nikkei.com/article/DGXLASDZ11HH7_R10C17A4TI1000/

気になる…。縮退なのか、撤退なのか…
オイラのペンタックス、Kマウントやめちゃうの
かなぁ?
コンパクトはもう見切りつけていいと思うけど、
せっかくフルサイズ出したのに、レンズ群全部
見捨てられちゃうのはとても困る…。

オイラは、Kマウントが好きだからペンタックス
使ってるのに。





https://twitter.com/metatetsu/status/852133105079078914

知らなかったねぇ…。

ソーラーパネルに電気流すと、赤外線を放射する
のか。

成原博士が、なんとなくそんなものを作っていた
ような気がする。






https://twitter.com/kerotto/status/854141492251705345

面白い試みな気がするけど、これ、プライバシーを
思いっきり侵害しそうな気がするなぁ。

こうやって、抵抗が少なさそうなところから監視社会
の第一歩を踏み出しておいて、なし崩し的に…みたいな。






http://japanese.engadget.com/2017/04/18/mastodonmst/

よくわかんないよぉ。
SNSなの?
1社寡占状態じゃないっていう分散の流れはなかなか
面白そうな気がするけど、SNS的なものは、mixiを
最初だけちょっとやって、アレ以来ずっと放置してるん
だよな。オイラにはなんか合わない気がして。

それにしても、分散サーバを個人が運営してるって
ことは、かつてのパソコン通信(死語)のBBSみたいに、
運営がやめちゃったら、そこにあった情報とか
コミュニティーとかが、ごっそり消えてなくなるの?



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする



« 壊れた。 TXD、RXD »
 
コメント
 
コメントはありません。
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。