Last active
November 17, 2015 00:43
-
-
Save andradei/6c4707addcb5dfdf6e2b to your computer and use it in GitHub Desktop.
Async Planet Destroyer in Python (asyncio)
This file contains 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 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') |
This file contains 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 asyncio | |
class Counter: | |
def __init__(self, maxcount): | |
self.maxcount = maxcount | |
@asyncio.coroutine | |
def count(self): | |
yield from asyncio.sleep(self.maxcount) | |
print('Done counting') |
This file contains 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 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() |
This file contains 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 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