Files
bitoj_python/python/engine.py

78 lines
2.2 KiB
Python
Executable File

import logging
import _thread
import threading
import time
import queue
from engineconfig import getConfig
class JudgeEngine:
def __init__(self):
self.quit_event = threading.Event()
self.test_queue = queue.Queue()
self.config = getConfig()
self.quit_event.clear()
self.logger = logging.getLogger('main')
def run(self):
# one thread mode is good for debugging
if self.config.test_threads == 1:
_thread.start_new_thread(self.transport, ())
self.test()
else:
for i in range(self.config.test_threads):
_thread.start_new_thread(self.test, ())
self.transport()
for ds in self.config.datasources:
ds.reset_submits()
self.logger.info('main thread quit')
return
def transport(self):
total = 0
while not self.quit_event.isSet():
self.logger.info(
"%d submit in test queue, %d processed" %
(self.test_queue.qsize(), total))
c = 16 - self.test_queue.qsize()
if c > 0:
submits = self.config.datasources[0].get_submits(c)
for submit in submits:
self.logger.info('Add submit %s to queue' % submit.id)
self.test_queue.put(submit)
total = total + len(submits)
time.sleep(self.config.fetch_interval)
self.logger.info("fetch thread quit")
return
def test(self):
while not self.quit_event.isSet():
# pdb.set_trace()
try:
submit = self.test_queue.get(True, self.config.fetch_interval)
except queue.Empty:
continue
tester = self.config.get_tester(submit.language)
if tester:
tester.test(submit)
else:
submit.set_status('compile_failed')
submit.set_compilemessage('No compiler specified')
self.logger.info("test thread quit")
return
def quit(self, signum, frame):
self.logger.info('signal receive: %d' % signum)
self.quit_event.set()
return
class JudgeError(Exception):
pass
# vim: set expandtab tabstop=4 shiftwidth=4: