Created
September 7, 2018 05:16
-
-
Save mydreambei-ai/ac97d8e136ccf94cca48cf11ae931c7f to your computer and use it in GitHub Desktop.
A simple threadpool using python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import socket | |
import threading | |
import queue | |
HOST = '0.0.0.0' | |
PORT = 50000 | |
class Worker(threading.Thread): | |
def __init__(self, queue, **kwargs): | |
threading.Thread.__init__(self, **kwargs) | |
self.queue = queue | |
def run(self): | |
while 1: | |
try: | |
sock = self.queue.get() | |
sock.send(self.name.encode()) | |
finally: | |
sock.close() | |
self.queue.task_done() | |
class ThreadPool(object): | |
def __init__(self, numbers=4, maxqueue = 100): | |
q = queue.Queue(maxsize=maxqueue) | |
self.queue = q | |
self.workers = {i: Worker(q) for i in range(numbers)} | |
def start(self): | |
for _, w in self.workers.items(): | |
w.start() | |
def add(self,sock): | |
self.queue.put(sock, timeout=1) | |
def __str__(self): | |
pass | |
class Application(object): | |
def __init__(self, host, port, threadpool=ThreadPool): | |
self.host = host | |
self.port = port | |
self.server = self.setup() | |
self.pool = threadpool() | |
@staticmethod | |
def setup(): | |
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) | |
return server | |
def bind(self, numbers=10): | |
self.server.bind((self.host, self.port)) | |
self.server.listen(numbers) | |
def run(self): | |
self.pool.start() | |
try: | |
while 1: | |
sock, addr = self.server.accept() | |
try: | |
self.pool.add(sock) | |
except queue.Full: | |
sock.close() | |
finally: | |
self.server.close() | |
app = Application(HOST,PORT) | |
app.bind() | |
app.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment