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みたいに、
運営がやめちゃったら、そこにあった情報とか
コミュニティーとかが、ごっそり消えてなくなるの?