forked from M-Labs/artiq
55 lines
1.6 KiB
Plaintext
55 lines
1.6 KiB
Plaintext
|
#!/usr/bin/env python3
|
||
|
|
||
|
import asyncio
|
||
|
import json
|
||
|
|
||
|
from artiq.management.scheduler import Scheduler
|
||
|
|
||
|
|
||
|
class Server:
|
||
|
def __init__(self, loop, scheduler):
|
||
|
self.scheduler = scheduler
|
||
|
self.terminate_notify = asyncio.Semaphore(0)
|
||
|
loop.run_until_complete(
|
||
|
asyncio.start_server(self.handle_connection, "::1", 8888))
|
||
|
|
||
|
@asyncio.coroutine
|
||
|
def handle_connection(self, reader, writer):
|
||
|
while True:
|
||
|
line = yield from reader.readline()
|
||
|
if not line:
|
||
|
writer.close()
|
||
|
return
|
||
|
obj = json.loads(line.decode())
|
||
|
action = obj["action"]
|
||
|
if action == "run_once":
|
||
|
yield from self.scheduler.add_run_once(obj["run_params"],
|
||
|
float(obj["timeout"]))
|
||
|
elif action == "quit":
|
||
|
self.terminate_notify.release()
|
||
|
else:
|
||
|
print("warning: unknown action " + action)
|
||
|
|
||
|
@asyncio.coroutine
|
||
|
def task(self, scheduler_task):
|
||
|
yield from self.terminate_notify.acquire()
|
||
|
scheduler_task.cancel()
|
||
|
|
||
|
|
||
|
def main():
|
||
|
loop = asyncio.get_event_loop()
|
||
|
try:
|
||
|
with Scheduler(loop) as scheduler:
|
||
|
server = Server(loop, scheduler)
|
||
|
scheduler_task = asyncio.Task(scheduler.task())
|
||
|
server_task = asyncio.Task(server.task(scheduler_task))
|
||
|
loop.run_until_complete(asyncio.wait([
|
||
|
scheduler_task,
|
||
|
server_task
|
||
|
]))
|
||
|
finally:
|
||
|
loop.close()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|