自己紹介

太田一樹。
東京の大学の情報科学科に通う大学生。moratorium満喫中。

お勧め書籍 [全部見る]

飾り

Search


Category Archives

Recent Entries

  1. 論文
  2. JJUG CCCでプレゼンします
  3. kzk's bookshelf
  4. En Google by Gulfweed
  5. PNUTS
  6. コメントスパム対策
  7. Hadoop + Luceneで分散インデクシング
  8. Hadoopの解析資料
  9. Cluster 2008
  10. SWoPP 2008

2006年12月07日

PythonでBounded Buffer

引き続きPythonでマルチスレッドプログラミングという事で、5月頃にOS演習で実装したBounded Bufferを実装しました。

Bounded Bufferとは生産者スレッドと消費者スレッドがあり、お互いが有限のバッファでデータをやりとりする際に用いられるものです。「生産者消費者問題」とかでググると出てくると思います。

コードは以下のようになりました。

import os
import sys
from threading import *

class BoundedBuffer:
    def __init__(self, maxlen):
        self.cv = Condition()
        self.datalist = []
        self.maxlen = maxlen
        return

    def produce(self, item):
        self.cv.acquire()
        while len(self.datalist) == self.maxlen:
            self.cv.wait()
        self.datalist.append(item)
        self.cv.notifyAll()
        self.cv.release()
        return

    def consume(self):
        self.cv.acquire()
        while (len(self.datalist) == 0)
            self.cv.wait()
        ret = self.datalist.pop(0)
        self.cv.notifyAll()
        self.cv.release()
        return ret

条件変数がさっくりと書けてしまいます。今回は中の条件もいじりたかったので自分で書いたのですが、普通はQueueクラスを使えば十分間に合いそうです。


trackbacks

trackbackURL:

comments

こういう時はlistを使うより、collectionsに入っているdequeを使う方がいいと思います。listは頭からpopすると、O(n)なので(C++のvectorとdequeのような感じです)。ちなみにQueueは内部でdequeを使ってますね。

  • okuji
  • 2006年12月07日 04:36

コメント有難うございます。内部を見てみたところ確かにdequeを使うとO(1)なので、そちらの方がこの場合には向いていますね。手元では10万個ぐらいのバッファを使うプログラムになったのですが、かなり性能が改善されましたm(_ _)m

  • kzk
  • 2006年12月08日 08:16
comment form
comment form