asyncio_micro: Optimize size of SysCall objects.

We have to have type header for any object, so use type to "store"
information about syscall type (my initial idea was to have single
syscall class and dispatch on its attribute, that would save memory
on having bunch of classes, but would increase size of each syscall
object).
pull/11/head
Paul Sokolovsky 2014-06-02 01:23:16 +03:00
rodzic 06c8c6ce8f
commit eff1250e3b
1 zmienionych plików z 19 dodań i 27 usunięć

Wyświetl plik

@ -7,9 +7,6 @@ import logging
log = logging.getLogger("asyncio") log = logging.getLogger("asyncio")
IO_READ = 1
IO_WRITE = 2
type_gen = type((lambda: (yield))()) type_gen = type((lambda: (yield))())
class EventLoop: class EventLoop:
@ -65,21 +62,21 @@ class EventLoop:
ret = cb.send(*args) ret = cb.send(*args)
log.debug("Coroutine %s yield result: %s", cb, ret) log.debug("Coroutine %s yield result: %s", cb, ret)
if isinstance(ret, SysCall): if isinstance(ret, SysCall):
arg = ret.args[0]
if isinstance(ret, Sleep): if isinstance(ret, Sleep):
delay = ret.args[0] delay = arg
elif isinstance(ret, IORead): elif isinstance(ret, IORead):
# self.add_reader(ret.obj.fileno(), lambda self, c, f: self.call_soon(c, f), self, cb, ret.obj) # self.add_reader(ret.obj.fileno(), lambda self, c, f: self.call_soon(c, f), self, cb, ret.obj)
# self.add_reader(ret.obj.fileno(), lambda c, f: self.call_soon(c, f), cb, ret.obj) # self.add_reader(ret.obj.fileno(), lambda c, f: self.call_soon(c, f), cb, ret.obj)
self.add_reader(ret.obj.fileno(), lambda cb, f: self.call_soon(cb, f), cb, ret.obj) self.add_reader(arg.fileno(), lambda cb, f: self.call_soon(cb, f), cb, arg)
continue continue
elif isinstance(ret, IOWrite): elif isinstance(ret, IOWrite):
self.add_writer(ret.obj.fileno(), lambda cb, f: self.call_soon(cb, f), cb, ret.obj) self.add_writer(arg.fileno(), lambda cb, f: self.call_soon(cb, f), cb, arg)
continue continue
elif isinstance(ret, IODone): elif isinstance(ret, IOReadDone):
if ret.op == IO_READ: self.remove_reader(arg.fileno())
self.remove_reader(ret.obj.fileno()) elif isinstance(ret, IOWriteDone):
elif ret.op == IO_WRITE: self.remove_writer(arg.fileno())
self.remove_writer(ret.obj.fileno())
elif isinstance(ret, type_gen): elif isinstance(ret, type_gen):
self.call_soon(ret) self.call_soon(ret)
elif ret is None: elif ret is None:
@ -146,8 +143,7 @@ class EpollEventLoop(EventLoop):
class SysCall: class SysCall:
def __init__(self, call, *args): def __init__(self, *args):
self.call = call
self.args = args self.args = args
def handle(self): def handle(self):
@ -157,20 +153,16 @@ class Sleep(SysCall):
pass pass
class IORead(SysCall): class IORead(SysCall):
pass
def __init__(self, obj):
self.obj = obj
class IOWrite(SysCall): class IOWrite(SysCall):
pass
def __init__(self, obj): class IOReadDone(SysCall):
self.obj = obj pass
class IODone(SysCall): class IOWriteDone(SysCall):
pass
def __init__(self, op, obj):
self.op = op
self.obj = obj
def get_event_loop(): def get_event_loop():
@ -184,7 +176,7 @@ def async(coro):
return coro return coro
def sleep(secs): def sleep(secs):
yield Sleep("sleep", secs) yield Sleep(secs)
import microsocket as _socket import microsocket as _socket
@ -202,7 +194,7 @@ class StreamReader:
break break
log.warn("Empty read") log.warn("Empty read")
if not res: if not res:
yield IODone(IO_READ, self.s) yield IOReadDone(self.s)
return res return res
def readline(self): def readline(self):
@ -215,7 +207,7 @@ class StreamReader:
break break
log.warn("Empty read") log.warn("Empty read")
if not res: if not res:
yield IODone(IO_READ, self.s) yield IOReadDone(self.s)
log.debug("StreamReader.readline(): res: %s", res) log.debug("StreamReader.readline(): res: %s", res)
return res return res
@ -247,7 +239,7 @@ class StreamWriter:
log.debug("StreamWriter.awrite(): can write more") log.debug("StreamWriter.awrite(): can write more")
def close(self): def close(self):
yield IODone(IO_WRITE, self.s) yield IOWriteDone(self.s)
self.s.close() self.s.close()