Created
March 30, 2018 07:17
-
-
Save xiazhibin/3c66fbb8c69b8326d0d90b1b28e929dd to your computer and use it in GitHub Desktop.
五种IO模型
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 time | |
tic = lambda x: '\nat %1.1f second' % (time.time() - x) | |
def get_request(path): | |
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
sock.connect(('127.0.0.1', 8088)) | |
sock.setblocking(0) | |
sock.send('GET {0} HTTP/1.0\r\n\r\n'.format(path).encode('utf-8')) | |
buffer = [] | |
while True: | |
try: | |
chunk = sock.recv(20) | |
if chunk: | |
buffer.append(chunk) | |
else: | |
break | |
except BlockingIOError as err: | |
pass | |
print(b''.join(buffer).decode('utf-8')) | |
sock.close() | |
s = time.time() | |
get_request('/') | |
get_request('/') | |
print(tic(s)) |
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 time | |
import selectors | |
tic = lambda x: '\nat %1.1f second' % (time.time() - x) | |
request_numb = 0 | |
slct = selectors.DefaultSelector() | |
address = ('127.0.0.1', 8088) | |
def read_data(sock, buffer): | |
global request_numb | |
slct.unregister(sock.fileno()) | |
chunck = sock.recv(10) | |
if chunck: | |
buffer.append(chunck) | |
callback = lambda: read_data(sock, buffer) | |
slct.register(sock.fileno(), selectors.EVENT_READ, callback) | |
else: | |
sock.close() | |
print(b''.join(buffer).decode('utf-8')) | |
request_numb -= 1 | |
def get_request(path): | |
global request_numb | |
request_numb += 1 | |
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
sock.connect(address) | |
sock.setblocking(0) | |
sock.send('GET {0} HTTP/1.0\r\n\r\n'.format(path).encode('utf-8')) | |
buffer = [] | |
callback = lambda: read_data(sock, buffer) | |
slct.register(sock.fileno(), selectors.EVENT_READ, callback) | |
s = time.time() | |
get_request('/') | |
get_request('/') | |
while request_numb: | |
events = slct.select() | |
for key, mask in events: | |
calllback_fn = key.data | |
calllback_fn() | |
print(tic(s)) |
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 time | |
import selectors | |
tic = lambda x: '\nat %1.1f second' % (time.time() - x) | |
request_numb = 0 | |
def coroutine(func): | |
def wrapper(*args, **kwargs): | |
def run(gen): | |
try: | |
future = next(gen) | |
future.callbacks.append(lambda: run(gen)) | |
except StopIteration: | |
pass | |
gen = func(*args, **kwargs) | |
run(gen) | |
return wrapper | |
class Future(object): | |
def __init__(self): | |
self.callbacks = [] | |
def resolve(self): | |
for cb in self.callbacks: | |
cb() | |
slct = selectors.DefaultSelector() | |
@coroutine | |
def get_request(path): | |
global request_numb | |
request_numb += 1 | |
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
sock.connect(('127.0.0.1', 8088)) | |
sock.setblocking(0) | |
f = Future() | |
slct.register(sock.fileno(), selectors.EVENT_WRITE, f) | |
yield f | |
slct.unregister(sock.fileno()) | |
sock.send('GET {0} HTTP/1.0\r\n\r\n'.format(path).encode('utf-8')) | |
buffer = [] | |
f = Future() | |
slct.register(sock.fileno(), selectors.EVENT_READ, f) | |
yield f | |
while True: | |
slct.unregister(sock.fileno()) | |
chunk = sock.recv(20) | |
if chunk: | |
buffer.append(chunk) | |
f = Future() | |
slct.register(sock.fileno(), selectors.EVENT_READ, f) | |
yield f | |
else: | |
sock.close() | |
request_numb -= 1 | |
print(b''.join(buffer).decode('utf-8')) | |
break | |
s = time.time() | |
get_request('/') | |
get_request('/') | |
while request_numb: | |
events = slct.select() | |
for key, mask in events: | |
fu = key.data | |
fu.resolve() | |
print(tic(s)) |
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 time | |
import selectors | |
tic = lambda x: '\nat %1.1f second' % (time.time() - x) | |
request_numb = 0 | |
def coroutine(func): | |
def wrapper(*args, **kwargs): | |
def run(gen): | |
try: | |
future = next(gen) | |
future.callbacks.append(lambda: run(gen)) | |
except StopIteration: | |
pass | |
gen = func(*args, **kwargs) | |
run(gen) | |
return wrapper | |
class Future(object): | |
def __init__(self): | |
self.callbacks = [] | |
def resolve(self): | |
for cb in self.callbacks: | |
cb() | |
slct = selectors.DefaultSelector() | |
@coroutine | |
def get_request(path): | |
global request_numb | |
request_numb += 1 | |
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
sock.connect(('127.0.0.1', 8088)) | |
sock.setblocking(0) | |
f = Future() | |
slct.register(sock.fileno(), selectors.EVENT_WRITE, f) | |
yield f | |
slct.unregister(sock.fileno()) | |
sock.send('GET {0} HTTP/1.0\r\n\r\n'.format(path).encode('utf-8')) | |
buffer = [] | |
f = Future() | |
slct.register(sock.fileno(), selectors.EVENT_READ, f) | |
yield f | |
while True: | |
slct.unregister(sock.fileno()) | |
chunk = sock.recv(20) | |
if chunk: | |
buffer.append(chunk) | |
f = Future() | |
slct.register(sock.fileno(), selectors.EVENT_READ, f) | |
yield f | |
else: | |
sock.close() | |
request_numb -= 1 | |
print(b''.join(buffer).decode('utf-8')) | |
break | |
class IOLoop(object): | |
request_numb = 0 | |
@classmethod | |
def instance(cls): | |
if not hasattr(cls, '_instance'): | |
cls._instace = cls() | |
return cls._instace | |
def start(self): | |
while request_numb: | |
events = slct.select() | |
for key, mask in events: | |
fu = key.data | |
fu.resolve() | |
s = time.time() | |
get_request('/') | |
get_request('/') | |
IOLoop.instance().start() | |
print(tic(s)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment