mung/server.py
2010-11-13 07:55:35 +00:00

63 lines
1.6 KiB
Python

import os, sys, time
from listener import Listener
from language import VirtualMachine
from database_fake import Fake_Database as Database
class Server(object):
def __init__(self, dbname):
self.dbname = dbname
self.db = Database(dbname)
self.vm = VirtualMachine(self.db)
self.max_sleep = 0.1
self.min_sleep = 0.005
self.vm_sleep_fudge = 0.85
self.server_started = None
self.loop_started = None
self.listeners = []
def listen(self, addr, port):
l = Listener()
l.listen(addr, port)
self.listeners.append(l)
def mainloop(self):
self.server_started = time.time()
while True:
self.loop_started = time.time()
for l in self.listeners:
l.handle_incoming_connections()
l.scan_for_input(self.read_input)
self.vm.run()
for l in self.listeners:
l.flush_output()
self.idlewait()
def read_input(self, conn, data):
ds = data.split('\n')
if ds[-1] == '':
del ds[-1]
for line in ds:
print "%s: %s" % (conn.id, line)
def idlewait(self):
if self.vm.sleepytime == None:
"virtual machine is still busy anyway, no sleeping on the job!"
return
"also check how much time we have spent already. if it's already been our polling"
"time (or longer!), there's no sense waiting even more!"
time_already_spent = time.time() - self.loop_started
sleepytime = min(self.max_sleep - time_already_spent, self.vm.sleepytime * self.vm_sleep_fudge)
if sleepytime < self.min_sleep or sleepytime < 0.0:
return
time.sleep(sleepytime)
if __name__ == "__main__":
srv = Server("Test")
srv.listen("", 7878)
srv.mainloop()