Lib.test.socketserver_test.py Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-standalone Show documentation
Show all versions of jython-standalone Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
# Used by test_threading_jy.py to verify no memory leaks in using a
# relatively large number of threads. This is of course an absolutely
# silly way to write real code on the JVM :), use a thread pool. So
# just for testing.
#
# However, the client here does use a thread pool.
#
# TODO monitor heap consumption too from appropriate MBean. Then we
# could presumably be adaptive or something clever like that.
#
# Test for http://bugs.jython.org/issue1660
import socket
import threading
import SocketServer
import time
from java.lang import Runtime
from java.util.concurrent import Executors, ExecutorCompletionService
class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
cur_thread = threading.currentThread()
response = "%s: %s" % (cur_thread.getName(), data)
self.request.send(response)
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
"mix together"
def client(ip, port, message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
sock.send(message)
response = sock.recv(1024)
# print threading.currentThread().getName(), response
sock.close()
if __name__ == "__main__":
# ephemeral ports should work on every Java system now
HOST, PORT = "localhost", 0
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
ip, port = server.server_address
# Start a daemon thread with the server -- that thread will then start one
# more thread for each request
server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
# create a client pool to run all client requests
pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)
ecs = ExecutorCompletionService(pool)
for i in xrange(4000): # empirically, this will exhaust heap when run with 16m heap
ecs.submit(lambda: client(ip, port, "Hello World %i" % i))
ecs.take() # wait until we have a thread available in the pool
pool.shutdown()