Skip to content

Instantly share code, notes, and snippets.

@xiazhibin
Created March 30, 2018 07:17
Show Gist options
  • Save xiazhibin/3c66fbb8c69b8326d0d90b1b28e929dd to your computer and use it in GitHub Desktop.
Save xiazhibin/3c66fbb8c69b8326d0d90b1b28e929dd to your computer and use it in GitHub Desktop.
五种IO模型
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))
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))
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))
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