spinner example ported to async/await and curio

This commit is contained in:
Luciano Ramalho 2017-07-06 11:38:22 -03:00
parent d7e37ad0fd
commit 8bbaeb1e36
5 changed files with 104 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,5 +1,6 @@
*.sublime-project
*.sublime-workspace
.env*
concurrency/flags/img/*.gif
concurrency/charfinder/charfinder_index.pickle
18-asyncio/charfinder/charfinder_index.pickle

2
18-asyncio/spinner_asyncio.py Normal file → Executable file
View File

@ -1,3 +1,5 @@
#!/usr/bin/env python3
# spinner_asyncio.py
# credits: Example by Luciano Ramalho inspired by

50
18-asyncio/spinner_await.py Executable file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env python3
# spinner_await.py
# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:
# https://mail.python.org/pipermail/python-list/2009-February/538048.html
import asyncio
import itertools
import sys
async def spin(msg): # <1>
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\\'):
status = char + ' ' + msg
write(status)
flush()
write('\x08' * len(status))
try:
await asyncio.sleep(.1) # <2>
except asyncio.CancelledError: # <3>
break
write(' ' * len(status) + '\x08' * len(status))
async def slow_function(): # <4>
# pretend waiting a long time for I/O
await asyncio.sleep(3) # <5>
return 42
async def supervisor(): # <6>
spinner = asyncio.ensure_future(spin('thinking!')) # <7>
print('spinner object:', spinner) # <8>
result = await slow_function() # <9>
spinner.cancel() # <10>
return result
def main():
loop = asyncio.get_event_loop() # <11>
result = loop.run_until_complete(supervisor()) # <12>
loop.close()
print('Answer:', result)
if __name__ == '__main__':
main()

49
18-asyncio/spinner_curio.py Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env python3
# spinner_curio.py
# credits: Example by Luciano Ramalho inspired by
# Michele Simionato's multiprocessing example in the python-list:
# https://mail.python.org/pipermail/python-list/2009-February/538048.html
import curio
import itertools
import sys
async def spin(msg): # <1>
write, flush = sys.stdout.write, sys.stdout.flush
for char in itertools.cycle('|/-\\'):
status = char + ' ' + msg
write(status)
flush()
write('\x08' * len(status))
try:
await curio.sleep(.1) # <2>
except curio.CancelledError: # <3>
break
write(' ' * len(status) + '\x08' * len(status))
async def slow_function(): # <4>
# pretend waiting a long time for I/O
await curio.sleep(3) # <5>
return 42
async def supervisor(): # <6>
spinner = await curio.spawn(spin('thinking!')) # <7>
print('spinner object:\n ', repr(spinner)) # <8>
result = await slow_function() # <9>
await spinner.cancel() # <10>
return result
def main():
result = curio.run(supervisor) # <12>
print('Answer:', result)
if __name__ == '__main__':
main()

2
18-asyncio/spinner_thread.py Normal file → Executable file
View File

@ -1,3 +1,5 @@
#!/usr/bin/env python3
# spinner_thread.py
# credits: Adapted from Michele Simionato's