Refactor the util directory to use subpackages.
This commit is contained in:
parent
974ccaa2e7
commit
18100be481
46 changed files with 36 additions and 39 deletions
58
util/registry/queuefile.py
Normal file
58
util/registry/queuefile.py
Normal file
|
@ -0,0 +1,58 @@
|
|||
from multiprocessing import Queue
|
||||
import os
|
||||
|
||||
class QueueFile(object):
|
||||
""" Class which implements a file-like interface and reads from a blocking
|
||||
multiprocessing queue.
|
||||
"""
|
||||
def __init__(self, queue, name=None):
|
||||
self._queue = queue
|
||||
self._closed = False
|
||||
self._done = False
|
||||
self._buffer = ''
|
||||
self._total_size = 0
|
||||
self._name = name
|
||||
self.raised_exception = False
|
||||
self._exception_handlers = []
|
||||
|
||||
def add_exception_handler(self, handler):
|
||||
self._exception_handlers.append(handler)
|
||||
|
||||
def read(self, size=8192):
|
||||
if self._closed or self._done:
|
||||
buf = self._buffer[0:size]
|
||||
self._buffer = self._buffer[size:]
|
||||
return buf
|
||||
|
||||
while len(self._buffer) < size:
|
||||
result = self._queue.get(block=True)
|
||||
if result is None:
|
||||
self._done = True
|
||||
break
|
||||
|
||||
if isinstance(result, Exception):
|
||||
self._closed = True
|
||||
self.raised_exception = True
|
||||
|
||||
handled = False
|
||||
for handler in self._exception_handlers:
|
||||
handler(result)
|
||||
handled = True
|
||||
|
||||
if handled:
|
||||
return
|
||||
|
||||
raise result
|
||||
|
||||
self._buffer += result
|
||||
self._total_size += len(result)
|
||||
|
||||
buf = self._buffer[0:size]
|
||||
self._buffer = self._buffer[size:]
|
||||
return buf
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
def close(self):
|
||||
self._closed = True
|
Reference in a new issue