Skip to content

Instantly share code, notes, and snippets.

@andradei
Last active November 17, 2015 00:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andradei/6c4707addcb5dfdf6e2b to your computer and use it in GitHub Desktop.
Save andradei/6c4707addcb5dfdf6e2b to your computer and use it in GitHub Desktop.
Async Planet Destroyer in Python (asyncio)
import asyncio
import logging
class Client(asyncio.Protocol):
def __init__(self, loop):
self.loop = loop
def connection_made(self, transport):
print('Connection with server established')
self.transport = transport
self.transport.write('remove one'.encode())
def data_received(self, data):
data = data.decode()
print('Received: ', data)
if not int(data):
print('Stopping loop')
self.loop.stop()
else:
message = 'remove one'.encode()
self.transport.write(message)
print('Sent:', message)
def connection_lost(self, exc):
print('Connection with server lost.')
self.loop.stop()
logging.basicConfig(level=logging.DEBUG)
loop = asyncio.get_event_loop()
fn = loop.create_connection(
lambda: Client(loop), '127.0.0.1', 8765
)
loop.run_until_complete(fn)
loop.run_forever()
loop.close()
print('Loop ended')
import asyncio
class Counter:
def __init__(self, maxcount):
self.maxcount = maxcount
@asyncio.coroutine
def count(self):
yield from asyncio.sleep(self.maxcount)
print('Done counting')
import asyncio
import logging
from counter import Counter
from series import Series
class MissionControl(asyncio.Protocol):
def __init__(self, loop, counter, series):
self.loop = loop
self.counter = counter
self.series = series
def connection_made(self, transport):
print('Connection established with', transport.get_extra_info('peername'))
self.transport = transport
def data_received(self, data):
data = data.decode()
print('Received:', data)
if data == 'remove one':
future = asyncio.async(self.series.remove_one(self.counter))
future.add_done_callback(self.on_removed_one)
else:
print('Done')
def connection_lost(self, exc):
print('Connection with {} ended'.format(self.transport.get_extra_info('peername')))
def on_removed_one(self, future):
print('Series is now: {}'.format(self.series.items))
self.transport.write(str(len(self.series.items)).encode())
logging.basicConfig(level=logging.DEBUG)
loop = asyncio.get_event_loop()
counter = Counter(2)
planets = Series(loop, ['Mercúrio', 'Vênus', 'Terra', 'Marte',
'Júpiter', 'Saturno', 'Urano', 'Netuno'])
fn = loop.create_server(
lambda: MissionControl(loop, counter, planets), '127.0.0.1', 8765
)
server = loop.run_until_complete(fn)
print('Server started')
try:
loop.run_forever()
except KeyboardInterrupt:
pass
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
import asyncio
class Series:
def __init__(self, loop, items=None):
self.loop = loop
self.items = items or []
@asyncio.coroutine
def remove_one(self, counter):
if len(self.items) is not 0:
yield from counter.count()
item = self.items.pop(0)
print('Removed', item)
else:
print('Series is empty')
@asyncio.coroutine
def start_removing(self, counter):
while self.items:
yield from self.remove_one(counter)
print('Series.start_removing() has finished')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment