class RemoteFileUploader(): """A class that allows parallel file uploading. Open with the with statement. Provides a writable object where bytes are supposed to be written to.""" def __init__(self, host, port, filename): self.url = "http://{}:{}/".format(host, port) self.filename = filename self.queue = CloseableQueue() self.rw = ReaderWorker(self.queue, self.url) self.queue_writer = QueueWriter(self.queue) def __enter__(self): self.rw.start() return self.queue_writer def __exit__(self, type, value, tb): self.queue.close() self.rw.join() print('Data sent to server.')
def __init__(self, host, port, filename): self.url = "http://{}:{}/".format(host, port) self.filename = filename self.queue = CloseableQueue() self.rw = ReaderWorker(self.queue, self.url) self.queue_writer = QueueWriter(self.queue)
def setUp(self): self.queue = CloseableQueue()
def _get(self): if self.fail_next_get: self.fail_next_get = False raise FailingQueueException, "You Lose" return CloseableQueue._get(self)
class CloseableQueueTest(TestCase): def setUp(self): self.queue = CloseableQueue() def _do_work(self, i): return i + 1 def _worker(self): while True: item = self.queue.get() self._do_work(item) self.queue.task_done() def _addToQueue(self, item): self.queue.put(item) def test_new_queue_should_be_empty(self): self.assertTrue(self.queue.empty()) def test_queue_with_one_item_should_not_be_empty(self): self.queue.put(1) self.assertFalse(self.queue.empty()) def test_shouldProcessAllMessagesOnQueue(self): t = Thread(target=self._worker) t.daemon = True for item in range(100): self._addToQueue(item) t.start() self.queue.join() self.assertTrue(self.queue.empty()) def test_new_queue_should_be_open(self): self.assertFalse(self.queue.closed()) def test_queue_should_be_closeable(self): self.queue.close() self.assertTrue(self.queue.closed()) def test_can_close_multiple_times(self): t1 = Thread(target=self.queue.close) t1.start() t2 = Thread(target=self.queue.close) t2.start() t1.join() t2.join() def test_should_not_add_to_closed_queue(self): self.queue.close() with self.assertRaises(ClosedQueueException): self.queue.put(10) def test_thread_can_clean_up(self): def work(): while not self.queue.closed(): try: _ = self.queue.get(timeout=3) except Empty: pass t = Thread(target=work) t.setDaemon(True) t.start() self.assertEqual(threading.active_count(), 2) self.queue.close() sleep(6) self.assertEqual(threading.active_count(), 1)
def _put(self, item): if self.fail_next_put: self.fail_next_put = False raise FailingQueueException, "You Lose" return CloseableQueue._put(self, item)
def __init__(self, *args): self.fail_next_put = False self.fail_next_get = False CloseableQueue.__init__(self, *args)