2011年5月30日月曜日

sleep sortをPython 3.2で

いい加減流行も過ぎましたが、sleep sortをpython3.2でやってみました。Barrierを使っているのでPython3.2以降でしか動きません。要素数が多少増えてもBarrierでスタートがそろうので、待ち時間を100で割ってもそれなりに結果が出る感じです(1000で割ると一桁msのあたりで逆転が起きた)

結果の受け取り方がださい気がして気にくわない。全部が終わってからまとめて取り出したかったのだけど、結局n回Queueからgetする形にした。全スレッドをjoinすれば終わったのは分かるけど、結局Queueから取り出す必要があるのでgetでブロックすれば十分。
何が気にくわないかと言えば、n回取り出すってあたりだけど、一回だけ待つ方法だと、nとEvent(かCondition), Semaphore(こいつがnを知ってるわけだけど)を渡す方法ぐらいしか思いつかなかったのであきらめた。

そもそもQueueはiterableじゃないので一発でリスト化も出来ないことが後で分かった。Queueを使うのをやめて、リスト使って排他制御すればいいと思うけどやってない。
Queueのjoinも良さそうだと思ったけど、これはタスクキュー的なイメージで、空になった場合しか使えないのでダメだった。入力と出力のQueueを分ければ、出力Queueに入れたところで、入力Queueのtask_done呼べば良いはず。

以下コード(gist)