Есть ли способ сделать блокировку чтения StringIO - PullRequest
3 голосов
/ 29 марта 2012

Я искал документацию и искал вокруг, но ничего не сказано о блокировании объектов StringIO.

Я мог бы создать свой собственный файлоподобный объект, который просто оборачивается вокруг StringIO, но как лучшесделать это блокировкой?Единственный известный мне способ - использовать цикл while и time.sleep (0.1) до тех пор, пока не появятся данные.

Ответы [ 2 ]

7 голосов
/ 30 марта 2012
import os

r, w = os.pipe()
r, w = os.fdopen(r, 'rb'), os.fdopen(w, 'wb')

Работает именно так, как мне нужно, эта функция канала, к сожалению, не очень очевидна в документации, поэтому я нашел ее позже.

0 голосов
/ 29 марта 2012

Нет, это довольно очевидно, если посмотреть на реализацию read()

def read(self, n = -1):
    """Read at most size bytes from the file
    (less if the read hits EOF before obtaining size bytes).

    If the size argument is negative or omitted, read all data until EOF
    is reached. The bytes are returned as a string object. An empty
    string is returned when EOF is encountered immediately.
    """
    _complain_ifclosed(self.closed)
    if self.buflist:
        self.buf += ''.join(self.buflist)
        self.buflist = []
    if n is None or n < 0:
        newpos = self.len
    else:
        newpos = min(self.pos+n, self.len)
    r = self.buf[self.pos:newpos]
    self.pos = newpos
    return r

В верхней части файла есть также эта заметка

Notes:
- Using a real file is often faster (but less convenient).

Так что, возможно, вам лучшевсе равно использовать реальный файл

...