def uhttpserver(request): tmp = tempfile.NamedTemporaryFile() server = uhttp.Server(tmp.name, uhttp.Connection) util.start_thread(server.serve_forever, kwargs={"poll_interval": 0.1}) request.addfinalizer(server.shutdown) request.addfinalizer(tmp.close) return server
def test_start_thread_kwargs(): result = {} def f(k=None): result["k"] = k util.start_thread(f, kwargs={"k": "v"}).join() assert result == {"k": "v"}
def test_start_thread_args(): result = [] def f(*a): result.extend(a) util.start_thread(f, args=(1, 2)).join() assert result == [1, 2]
def server(): server = http.Server(("127.0.0.1", 0), http.Connection) log.info("Server listening on port %d", server.server_port) server.app = http.Router([ (r"/demo/(.*)", Demo()), (r"/echo/(.*)", Echo()), (r"/json/", JSON()), (r"/range-demo/", RangeDemo()), (r"/request-info/(.*)", RequestInfo()), (r"/context/(.*)", Context()), (r"/close-context/(.*)", CloseContext()), (r"/server-error/(.*)", ServerError()), (r"/server-socket-error/(.*)", ServerSocketError()), (r"/client-error/(.*)", ClientError()), (r"/keep-connection/", KeepConnection()), (r"/partial-response/", PartialResponse()), ]) t = util.start_thread(server.serve_forever, kwargs={"poll_interval": 0.1}) try: yield server finally: server.shutdown() t.join()
def test_run_operation_benchmark(): # Run 1000000 operations with 4 concurrent threads. ticket = Ticket(testutils.create_ticket(ops=["read"])) operations = 10**6 workers = 4 chunk = 10**9 step = chunk * workers // operations def worker(offset, size): while offset < size: ticket.run(Operation(offset, step)) offset += step start = time.time() threads = [] try: for i in range(workers): t = util.start_thread(worker, args=(i * chunk, chunk)) threads.append(t) finally: for t in threads: t.join() elapsed = time.time() - start print("%d operations, %d concurrent threads in %.2f seconds (%d nsec/op)" % (operations, workers, elapsed, elapsed * 10**9 // operations))
def server(): server = http.Server(("127.0.0.1", 0), http.Connection) log.info("Server listening on port %d", server.server_port) server.app = http.Router([ (r"/demo/(.*)", Demo()), (r"/echo/(.*)", Echo()), (r"/json/", JSON()), (r"/range-demo/", RangeDemo()), (r"/request-info/(.*)", RequestInfo()), (r"/context/(.*)", Context()), (r"/close-context/(.*)", CloseContext()), (r"/server-error/(.*)", ServerError()), (r"/server-socket-error/(.*)", ServerSocketError()), (r"/client-error/(.*)", ClientError()), (r"/keep-connection/", KeepConnection()), (r"/partial-response/", PartialResponse()), ]) t = util.start_thread( server.serve_forever, kwargs={"poll_interval": 0.1}) try: yield server finally: server.shutdown() t.join()
def test_uninterruptible_interrupt(): r, w = os.pipe() signo = signal.SIGUSR1 prev = signal.signal(signo, lambda s, f: True) try: def read(): return os.read(r, 1) def write(): time.sleep(0.1) os.kill(os.getpid(), signo) time.sleep(0.1) os.write(w, b'a') util.start_thread(write) assert util.uninterruptible(read) == b'a' finally: signal.signal(signo, prev) os.close(r) os.close(w)
def test_uninterruptible_interrupt(): r, w = os.pipe() signo = signal.SIGUSR1 prev = signal.signal(signo, lambda s, f: True) try: def read(): return os.read(r, 1) def write(): time.sleep(0.1) os.kill(os.getpid(), signo) time.sleep(0.1) os.write(w, 'a') util.start_thread(write) assert util.uninterruptible(read) == 'a' finally: signal.signal(signo, prev) os.close(r) os.close(w)
def test_start_thread_name(): t = util.start_thread(lambda: None, name="foo") t.join() assert t.name == "foo"
def test_start_thread_non_daemon(): t = util.start_thread(lambda: None, daemon=False) t.join() assert not t.daemon
def test_start_thread_daemon(): t = util.start_thread(lambda: None) t.join() assert t.daemon
def start(self): util.start_thread(self._run, name=self.name)
def start(self): log.debug("Starting %s", self.name) util.start_thread( self._server.serve_forever, kwargs={"poll_interval": self._config.daemon.poll_interval}, name=self.name)
def start_server(config, server, name): log.debug("Starting thread %s", name) util.start_thread(server.serve_forever, kwargs={"poll_interval": config.daemon.poll_interval}, name=name)